@ над определением функции, которую нужно декорировать.
@my_decorator
def my_function():
print("Hello!")
Это эквивалентно my_function = my_decorator(my_function).
Декораторы в Python предоставляют мощный способ модификации или расширения функциональности функций или методов без прямого изменения их кода. Они позволяют добавить функциональность "вокруг" существующей функции, например, логирование, проверку прав доступа, кэширование и т.д.
Основной принцип использования: Декоратор - это функция, которая принимает другую функцию в качестве аргумента, добавляет ей некоторое поведение, и возвращает новую, модифицированную функцию.
Синтаксис: Синтаксически декоратор обозначается символом @, расположенным непосредственно перед определением функции, которую нужно декорировать. Имя, следующее за @, - это имя функции-декоратора.
Пример:
def my_decorator(func):
def wrapper():
print("До выполнения функции.")
func()
print("После выполнения функции.")
return wrapper
@my_decorator
def say_hello():
print("Привет!")
say_hello()
Разъяснение примера:
my_decorator - это функция-декоратор. Она принимает функцию func в качестве аргумента.wrapper - это внутренняя функция, определенная внутри декоратора. Она содержит дополнительную логику (вывод текста до и после выполнения).wrapper вызывается исходная функция func().my_decorator возвращает функцию wrapper.@my_decorator перед определением say_hello эквивалентна say_hello = my_decorator(say_hello). То есть, функция say_hello передается в декоратор my_decorator, который возвращает новую, "обернутую" функцию, которая присваивается переменной say_hello.say_hello(), на самом деле вызывается wrapper(), которая выводит "До выполнения функции.", затем вызывает исходную say_hello() (выводит "Привет!"), а затем выводит "После выполнения функции.".Декораторы с аргументами: Если функция, которую нужно декорировать, принимает аргументы, их нужно передать в wrapper, используя *args и **kwargs:
def my_decorator_with_args(func):
def wrapper(*args, **kwargs):
print("До выполнения функции с аргументами.")
result = func(*args, **kwargs)
print("После выполнения функции с аргументами.")
return result
return wrapper
@my_decorator_with_args
def add(x, y):
return x + y
result = add(5, 3)
print(result)
Преимущества использования декораторов: