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

Декоратор-класс: какой метод нужно переопределить?

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") — вызов декорированной функции, который продемонстрирует работу декоратора.

Декоратор-класс позволяет добавлять дополнительную функциональность к функциям, сохраняя при этом их оригинальное поведение.

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

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

Твои заметки