Назад к вопросам
Junior
96
questionbank
Можно ли использовать несколько декораторов для одной функции?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
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 выполняется внешней.