python演练装饰器
一:代码演示
# -*- coding: UTF-8 -*-
class Counter:
def __init__(self, func):
self.count = 0
self.func = func
def __call__(self, *args, **kwargs):
self.count += 1
return self.func(args, kwargs)
@Counter
def foo(*args, **kwargs):
print 1,
for i in range(10):
foo(1, 2, 3, 4, a=2, b=3)
print(foo.count)
二:运行结果
三:分析
1⃣️首先在要装饰的方法上加上一个@Counter(类名)
2⃣️加上之后声明__call__方法,最后在return foo(args, kwargs) (方法名)不加之后不会执行foo里面的逻辑
3⃣️最后累加的count是一个累加后的结果,原因:当加上@Counter之后,函数会把本身传到类里。最后返回
的时候函数又等于实例foo = counter。不再是函数本身。而且是同一个实例。count菜才会累加。
参考博文:Python __call__详解