__call__
__call__是python魔术方法——可调用对象,指的是可以实现一个对象实例以函数的方式来调用。
class Test: def __call__(self, *args, **kws): print(*args, **kws) t = Test() t("你好","hello word")
无参数装饰器
现在有一个out函数,用于打印输出。现在要想要统计这函数执行了多少次
class Count: def __init__(self,func): self.func = func self.i = 0 def __call__(self,*args,**kws): self.i += 1 print(f"执行次数:{self.i}") return self.func(*args,**kws) @Count def out(s): print(s) out("你好") out("呵呵")
'''
相当于
out = Count(out)
out()
把函数传入Count类中,创建对象实例 然后利用__call__魔术方法实现执行可调用对象
'''
有参数装饰器
现在Count类有一个属性color,给统计数值上颜色。
class Count: def __init__(self, color): self.color = color self.i = 0 def __call__(self, func): self.func = func return self.__callback def __callback(self, *args, **kw): self.i += 1 print(f"执行次数:{self.color} {self.i}") return self.func(*args, **kw) @Count("红色") # 接收参数 def test(s): print(s) test("哈哈")
'''
等价于
d = Count("红色")
test = d(test)
test("哈哈")
'''
test("哈哈") test("哈哈")
''' 输出
执行次数:红色 1
哈哈
执行次数:红色 2
哈哈
执行次数:红色 3
哈哈
'''