Вопрос проверяет понимание того, что декоратором может быть любой callable-объект, включая функции, классы и объекты с методом __call__.
Callable-объект — это любой объект, который можно вызвать с помощью круглых скобок. В Python к ним относятся функции, классы, а также экземпляры классов, у которых определён метод __call__. Декоратор — это просто callable, который принимает функцию или класс и возвращает их модифицированную версию.
Рассмотрим три способа создания декоратора:
__init__ и делает экземпляр callable через __call__.# Функция-декоратор
def my_decorator(func):
def wrapper():
print('Before')
func()
print('After')
return wrapper
# Класс-декоратор
class ClassDecorator:
def __init__(self, func):
self.func = func
def __call__(self):
print('Before')
self.func()
print('After')
# Экземпляр с __call__ как декоратор
class CallableInstance:
def __call__(self, func):
def wrapper():
print('Before')
func()
print('After')
return wrapper
my_instance = CallableInstance()
@my_decorator
def say_hello():
print('Hello')
@ClassDecorator
def say_hi():
print('Hi')
@my_instance
def say_hey():
print('Hey')Возможность использовать любой callable как декоратор даёт гибкость: можно создавать параметризованные декораторы через классы, хранить состояние в экземплярах или переиспользовать логику. Это часто используется в фреймворках (например, Flask, Django) для регистрации маршрутов или middleware.
Вывод: Любой callable-объект может быть декоратором, что позволяет выбирать наиболее удобный способ реализации в зависимости от задачи — от простых функций до сложных классов с состоянием.