Декоратор-класс: какой метод нужно переопределить?
1️⃣ Как кратко ответить
Для создания декоратор-класса в Python необходимо переопределить метод __call__. Этот метод позволяет экземпляру класса быть вызываемым как функция, что делает его подходящим для использования в качестве декоратора.
2️⃣ Подробное объяснение темы
Декораторы в Python — это конструкции, которые позволяют изменять или расширять поведение функций или методов. Обычно декораторы реализуются как функции, но их также можно реализовать с помощью классов. Декоратор-класс предоставляет более гибкие возможности, так как может хранить состояние и использовать методы класса.
Зачем это нужно
Декораторы-классы полезны, когда требуется более сложная логика, чем та, которую можно реализовать с помощью функции-декоратора. Они позволяют сохранять состояние между вызовами, использовать наследование и инкапсуляцию.
Как это работает
Чтобы класс мог использоваться как декоратор, он должен быть вызываемым. Это достигается переопределением метода __call__. Когда экземпляр класса вызывается как функция, Python вызывает метод __call__.
Пример кода
class MyDecorator:
def __init__(self, func):
# Сохраняем ссылку на декорируемую функцию
self.func = func
def __call__(self, *args, **kwargs):
# Логика, выполняемая до вызова функции
print("Перед вызовом функции")
# Вызов декорируемой функции с переданными аргументами
result = self.func(*args, **kwargs)
# Логика, выполняемая после вызова функции
print("После вызова функции")
# Возвращаем результат выполнения функции
return result
# Пример использования декоратора-класса
@MyDecorator
def say_hello(name):
print(f"Hello, {name}!")
# Вызов декорированной функции
say_hello("Alice")
Подробный разбор кода
class MyDecorator:— определение классаMyDecorator, который будет использоваться как декоратор.def __init__(self, func):— конструктор класса, который принимает функциюfuncи сохраняет её в атрибутеself.func. Это позволяет декоратору "запомнить", какую функцию он декорирует.def __call__(self, *args, **kwargs):— метод__call__, который делает экземпляр класса вызываемым. Он принимает произвольные позиционные и именованные аргументы, которые будут переданы декорируемой функции.print("Перед вызовом функции")— пример логики, выполняемой до вызова декорируемой функции.result = self.func(*args, **kwargs)— вызов декорируемой функции с переданными аргументами и сохранение её результата.print("После вызова функции")— пример логики, выполняемой после вызова декорируемой функции.return result— возвращение результата выполнения декорируемой функции.@MyDecorator— применение декоратора к функцииsay_hello.def say_hello(name):— определение функции, которая будет декорирована.say_hello("Alice")— вызов декорированной функции, который продемонстрирует работу декоратора.
Декоратор-класс позволяет добавлять дополнительную функциональность к функциям, сохраняя при этом их оригинальное поведение.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться