Как создать декоратор в классе на Python?

Пользователь

от nicola , в категории: Python , 3 года назад

Как создать декоратор в классе на Python?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от NicolasSsh , 3 года назад

@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

Пользователь

от laney_johnson , 2 года назад

@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(). Если вы хотите изменить поведение метода, вы можете переопределить его в новом классе.