Python装饰器(5)类装饰器

内容纯属个人理解,不对之处,欢迎指正。

__call__

在Python中,具有__call__方法的对象才可以被执行,执行的过程就是__call__被调用的过程。
示例:

#定义类A,然后定义__call__方法使其返回两个参数的乘积
class A:
    def __call__(self, x, y):
        return x * y
>> a = A()
>> a(2, 6)
12
>> a.__call__(2, 6)
12

由此可以看出,当给类生成的对象传入参数后,类自动调用__call__方法,由此特性,我们便可以使用类去构造装饰器。

构造类装饰器

装饰器构造需要函数传递与参数传递,在程序执行时,就需要先装饰函数,所以当函数的传递应该在类中首先执行,那么函数的传递就应该在对象初始化部分:

def __init__(self, func):
    self.func = func

由于__call__方法中是接收参数并执行,那么__call__中接收的便是func函数的参数:

def __call__(self, *args, **kwargs):
    self.func(*args, **kwargs)

自定义实现类装饰器

# 通过函数结果来返回不同的值:奇数返回1,偶数返回-1
class Odevity:

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        ret = self.func(*args, **kwargs)
        if ret % 2 == 0:
            return -1
        else:
            return 1


@Odevity
def foo(x, y):
    return x + y
>> foo(1, 2)
1
>> foo(1, 3)
-1

你可能感兴趣的:(Python装饰器(5)类装饰器)