← Назад ко всем вопросам

Как использовать декоратор без @?

1️⃣ Как кратко ответить

Декоратор можно использовать без синтаксиса @, вызвав его как обычную функцию. Оберните целевую функцию в декоратор, передав её как аргумент, и присвойте результат обратно переменной с именем функции.

2️⃣ Подробное объяснение темы

Декораторы в Python — это функции, которые принимают другую функцию в качестве аргумента и возвращают новую функцию с изменённым или расширенным поведением. Обычно декораторы применяются с помощью синтаксиса @, но их можно использовать и без него, вызывая декоратор как обычную функцию.

Пример использования декоратора без @

Рассмотрим пример, где у нас есть декоратор, который выводит сообщение перед и после вызова функции.

def my_decorator(func):
    def wrapper():
        print("Перед вызовом функции")
        func()
        print("После вызова функции")
    return wrapper
​
def say_hello():
    print("Hello!")
​
# Применение декоратора без использования @
say_hello = my_decorator(say_hello)
​
say_hello()

Объяснение кода:

  1. Определение декоратора:

    def my_decorator(func):
        def wrapper():
            print("Перед вызовом функции")
            func()
            print("После вызова функции")
        return wrapper
    
    • my_decorator — это функция-декоратор, которая принимает функцию func в качестве аргумента.
    • Внутри my_decorator определена функция wrapper, которая оборачивает вызов func дополнительными действиями: выводит сообщение до и после вызова func.
    • my_decorator возвращает функцию wrapper.
  2. Определение целевой функции:

    def say_hello():
        print("Hello!")
    
    • say_hello — это простая функция, которая выводит строку "Hello!".
  3. Применение декоратора без @:

    say_hello = my_decorator(say_hello)
    
    • Здесь мы вызываем my_decorator, передавая в него say_hello как аргумент.
    • Результат вызова my_decorator(say_hello) — это функция wrapper, которая теперь присваивается переменной say_hello.
    • Таким образом, say_hello теперь ссылается на обёрнутую версию функции, которая включает дополнительное поведение, определённое в wrapper.
  4. Вызов обёрнутой функции:

    say_hello()
    
    • При вызове say_hello() теперь выполняется код внутри wrapper, который сначала выводит "Перед вызовом функции", затем вызывает оригинальную say_hello, и, наконец, выводит "После вызова функции".

Использование декоратора без @ может быть полезно, когда необходимо динамически применять декораторы или когда требуется более явное управление процессом обёртывания функций.

Тема: Python
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки