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

В чем отличие @func от @func()?

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

@func — это декоратор без параметров, который применяется к функции. @func() — это декоратор с параметрами, который возвращает функцию-декоратор. Разница в том, что @func() позволяет передавать параметры в декоратор.

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

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

@func

Когда вы видите @func, это означает, что func — это функция-декоратор, которая принимает другую функцию в качестве аргумента и возвращает новую функцию. Это простой случай, когда декоратор не принимает никаких дополнительных параметров.

Пример:

def simple_decorator(func):
    def wrapper():
        print("Before function call")
        func()
        print("After function call")
    return wrapper
​
@simple_decorator
def say_hello():
    print("Hello!")
​
say_hello()
  • simple_decorator — это функция-декоратор, которая принимает func как аргумент.
  • wrapper — это внутренняя функция, которая оборачивает вызов func.
  • @simple_decorator применяется к say_hello, изменяя её поведение.
  • При вызове say_hello(), сначала выполняется код в wrapper, затем вызывается оригинальная функция say_hello, и после этого выполняется оставшийся код в wrapper.

@func()

Когда вы видите @func(), это означает, что func — это функция, которая возвращает функцию-декоратор. Это позволяет передавать параметры в декоратор.

Пример:

def parametrized_decorator(param):
    def decorator(func):
        def wrapper():
            print(f"Decorator parameter: {param}")
            func()
        return wrapper
    return decorator
​
@parametrized_decorator("Hello")
def greet():
    print("Greetings!")
​
greet()
  • parametrized_decorator — это функция, которая принимает параметр param.
  • Она возвращает функцию decorator, которая является декоратором.
  • decorator принимает func как аргумент и возвращает wrapper.
  • @parametrized_decorator("Hello") применяется к greet, передавая "Hello" в качестве параметра.
  • При вызове greet(), сначала выполняется код в wrapper, который использует переданный параметр, затем вызывается оригинальная функция greet.

Зачем это нужно

Использование декораторов позволяет легко изменять поведение функций без изменения их кода. Это особенно полезно для кросс-функциональных задач, таких как логирование, проверка прав доступа, кэширование и другие аспекты, которые могут быть применены к нескольким функциям. Возможность передавать параметры в декораторы делает их более гибкими и мощными, позволяя настраивать их поведение в зависимости от контекста.

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

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

Твои заметки