Python decorator

Декораторм в python является функция, возвращающая другую функцию. Обычно применяется как преобразование функции с использованием синтаксиса @wrapper. Распространенными примерами декораторов являются classmethod() и staticmethod().

Cледующие два определения декоратора семантически эквивалентны:

def f(...):
    ...
f = staticmethod(f)

@staticmethod
def f(...):
    ...

Примеры декораторов:

Функция декоратор принимает другую функцию, передает ее аргументы обертке и возвращает результат вычислений

>>> def deco(this):
...     def wrapper(*args, **kwargs):
...         print('wrap')
...         return this(*args, **kwargs)
...     return wrapper

>>> @deco
>>> def main(a, b=2):
...     print(f'in main {a} != {b}')
    
>>> main(1)
wrap
in main 1 != 2

Класс-декоратор реализует тот же механизм в методе __call__

>>> class This:
...     def __call__(self, this):
...         def wrapper(*args, **kwargs):
...             print('wrap')
...             return this(*args, **kwargs)
...         return wrapper
        
>>> @This()
>>> def main_cls(a, b=2):
...     print(f'in main {a} != {b}')
    
>>> main_cls(1)
wrap
in main 1 != 2

Декоратор класса принимает класс вмест офункцйии и реализует метод, декорирующий методы класса

>>> def cls_deco(cls):
...     def wrapper(*args, **kwargs):
...         print('wrap')
...         wrapper.instance = cls(*args, **kwargs)
...         return wrapper.instance
...     return wrapper
    
>>> @cls_deco
>>> class Main:
...     def __init__(self, a, b=2):
...         self.a = a
...         self.b = b
    
...     def what(self):
...         return f'in Main {self.a} != {self.b}'

>>> c = Main(1)
>>> print(c.what())
wrap
in main 1 != 2

Подробнее о декорировании функций и декорирвоании классов

[python-standart-library]

>>> На главную