Проверяет понимание декораторов в Python и возможности использования классов в качестве декораторов.
Декоратор в Python — это вызываемый объект (callable), который принимает функцию или класс и возвращает модифицированную версию. Обычно декораторы реализуются как функции, но классы также могут быть декораторами, если они реализуют метод __call__.
Чтобы класс мог выступать в роли декоратора, его экземпляр должен быть вызываемым. Для этого в классе определяется метод __call__. Когда вы используете класс как декоратор, Python вызывает конструктор __init__ с декорируемой функцией в качестве аргумента, а затем при каждом вызове декорированной функции вызывается метод __call__.
class MyDecorator:
def __init__(self, func):
self.func = func
self.count = 0
def __call__(self, *args, **kwargs):
self.count += 1
print(f"Вызов {self.count} функции {self.func.__name__}")
return self.func(*args, **kwargs)
@MyDecorator
def say_hello(name):
print(f"Привет, {name}!")
say_hello("Анна")
say_hello("Иван")В этом примере класс MyDecorator используется как декоратор. Он подсчитывает количество вызовов декорированной функции и выводит сообщение перед каждым вызовом.
Классы-декораторы полезны, когда нужно хранить состояние между вызовами функции (например, счетчики, кэширование) или когда требуется более сложная логика, чем в простой функции-декораторе. Они часто используются в фреймворках для логирования, профилирования или управления доступом.
Использование класса в качестве декоратора — мощный инструмент Python, который позволяет создавать декораторы с сохранением состояния и дополнительными методами. Это особенно удобно, когда декоратор должен быть настраиваемым или иметь внутренние данные.