内容纯属个人理解,不对之处,欢迎指正。
__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
网友评论