将装饰器定义为类的一部分

2019-02-20  本文已影响0人  noteby

场景:在类中定义装饰器,并将其作用在其他函数或方法上。

from functools import wraps


class A:
    # Create a property
    @property
    def first_name(self):
        return self._first_name

    # Apply decorator methods
    @first_name.setter
    def first_name(self, value):
        if not isinstance(value, str):
            raise TypeError('Expected a string')
        self._first_name = value

    # Decorator as an instance method
    def decorator1(self, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print('Decorator 1')
            return func(*args, **kwargs)

        return wrapper

    # Decorator as a class method
    @classmethod
    def decorator2(cls, func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print('Decorator 2')
            return func(*args, **kwargs)

        return wrapper


# As an instance method
a = A()


@a.decorator1
def func1():
    print('func1')


# As a class method
@A.decorator2
def func2():
    print('func2')


if __name__ == '__main__':
    func1()
    func2()
    a.first_name = 'lily'
    print(a.first_name)
上一篇下一篇

猜你喜欢

热点阅读