Python декораторы: использование и применение
Python декораторы - это механизм, который позволяет изменять поведение функций и методов без изменения их исходного кода. Декораторы могут быть использованы для добавления новых функциональностей, изменения аргументов функций и методов, контроля доступа и обработки исключений.
Декораторы в Python - это функции, которые принимают функцию в качестве аргумента и возвращают другую функцию в качестве результата. Они используются для модификации поведения функций при их выполнении.
Код, приведенный ниже, демонстрирует декоратор, который выводит дату и время выполнения функции:
python
import datetime
def log_time(func):
def wrapper(*args, **kwargs):
start_time = datetime.datetime.now()
result = func(*args, **kwargs)
end_time = datetime.datetime.now()
print(f"Function {func.__name__} was executed at {start_time} and finished at {end_time}")
return result
return wrapper
@log_time
def my_function(number):
return number ** 2
print(my_function(5))
В этом примере, декоратор `log_time` принимает функцию `func` в качестве аргумента и возвращает функцию `wrapper`, которая вызывает функцию `func`, замеряет время ее выполнения и выводит его в консоль, после чего возвращает результат выполнения функции `func`.
Декоратор `@log_time` применяется к функции `my_function`, что приводит к изменению ее поведения при выполнении. Теперь при каждом вызове `my_function` в консоль будет выводиться время ее выполнения.
Другой пример использования декораторов - это декоратор, который проверяет типы аргументов передаваемых в функцию. Пример кода:
python
def type_check(func):
def wrapper(*args):
for arg in args:
if not isinstance(arg, (int, float)):
raise TypeError("Argument should be int or float")
return func(*args)
return wrapper
@type_check
def my_function(x, y):
return x ** y
print(my_function(2, 3))
print(my_function("a", "b"))
Декоратор `type_check` проверяет типы аргументов, передаваемых в функцию `my_function`. Если какой-либо из аргументов не является целым или дробным числом, генерируется исключение типа TypeError. В противном случае функция `my_function` вызывается с этими аргументами.
Декораторы помогают разделить код на логические блоки, сделать его более читаемым и модульным, и добавлять новые функциональности без изменения первоначального кода функций и методов.