Sobes.tech
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 выполняется внешней.