Back to questions
Junior
181
Можно ли использовать несколько декораторов для одной функции?
Answer from AI
sobes.tech AI
Да, можно использовать несколько декораторов последовательно. Декораторы применяются снизу вверх.
Применение нескольких декораторов:
# Декоратор 1
def decorator_one(func):
def wrapper(*args, **kwargs):
print("Перед вызовом функции (декоратор 1)")
result = func(*args, **kwargs)
print("После вызова функции (декоратор 1)")
return result
return wrapper
# Декоратор 2
def decorator_two(func):
def wrapper(*args, **kwargs):
print("Перед вызовом функции (декоратор 2)")
result = func(*args, **kwargs)
print("После вызова функции (декоратор 2)")
return result
return wrapper
# Применение обоих декораторов
@decorator_one
@decorator_two
def my_function():
print("Внутри my_function")
# Вызов функции
my_function()
Порядок выполнения:
При вызове my_function() сначала применяется @decorator_two к my_function, затем @decorator_one применяется к результату @decorator_two.
Эквивалентное представление без синтаксиса @:
def my_function():
print("Внутри my_function")
# Эквивалентно @decorator_two
my_function = decorator_two(my_function)
# Эквивалентно @decorator_one
my_function = decorator_one(my_function)
# Вызов функции
my_function()
Вывод при выполнении:
Перед вызовом функции (декоратор 1)
Перед вызовом функции (декоратор 2)
Внутри my_function
После вызова функции (декоратор 2)
После вызова функции (декоратор 1)
Видно, что "обертка" decorator_two выполняется первой (внутренней) вокруг вызова my_function, а "обертка" decorator_one выполняется внешней.