@nicola Для того, чтобы создать декоратор-класс, Вы можете воспользоваться библиотекой functools
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
from functools import wraps # Импортируем из functools модуль для работы с декораторами class Replicator: ''' Данный декоратор принимает в аргументы переменную int - количество повторов функции ''' def __init__(self, count): self.count = count def __call__(self, f): # Создаем функцию, которая будет срабатывать при вызове класса @wraps(f) def wrapper(*args, **kwargs): for _ in range(self.count): f(*args, **kwargs) return wrapper @Replicator(5) # Над функцией обозначаем декоратор, в аргументах которого стоит число - это то, сколько раз выполнится функция # Т.К это декоратор, то аргумент f(саму функцию) он получит автоматически def GET(url): print(url) if __name__ == "__main__": GET("dropcode.ru") # Вывод : # dropcode.ru # dropcode.ru # dropcode.ru # dropcode.ru # dropcode.ru |
@nicola
В Python вы можете создавать декораторы для классов, как и для функций. Декораторы позволяют изменять поведение класса без изменения его кода.
Вот простой пример декоратора класса:
1 2 3 4 5 6 7 8 9 10 11 12 |
def my_decorator(cls): class NewClass: def __init__(self, *args, **kwargs): self.instance = cls(*args, **kwargs) def __getattr__(self, name): return getattr(self.instance, name) def new_method(self): print("This is a new method.") return NewClass |
Этот декоратор создает новый класс, который оборачивает исходный класс. В этом примере декоратор добавляет новый метод new_method()
к классу. Чтобы применить декоратор к классу, вы можете использовать следующий синтаксис:
1 2 3 4 |
@my_decorator class MyClass: def my_method(self): print("This is my method.") |
Как только декоратор применен, MyClass
будет заменен на NewClass
, который был создан декоратором. Теперь MyClass
имеет новый метод new_method()
, который можно вызвать так:
1 2 |
my_object = MyClass() my_object.new_method() # "This is a new method." |
Обратите внимание, что в этом примере декоратор не изменяет поведение исходного метода my_method()
. Если вы хотите изменить поведение метода, вы можете переопределить его в новом классе.