Назад к вопросам
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 выполняется внешней.