python装饰器的另一种写法
import time
import functools
class DelayFunc:
def __init__(self, duration, func):
self.duration = duration
self.func = func
def __call__(self, *args, **kwargs):
print("delayed:", self.duration)
time.sleep(self.duration)
return self.func(*args, **kwargs)
def eager_call(self, *args, **kwargs):
print('Call without delay')
return self.func(*args, **kwargs)
def delay(duration):
"""装饰器:推迟某个函数的执行。同时提供 .eager_call 方法立即执行
"""
return functools.partial(DelayFunc, duration)
1) 不用装饰器
def add(a, b):
return a + b
DelayFunc(2, add)(1,2)
DelayFunc(2, add).eager_call(1, 2)
# 这里的 delay(2) <==> DelayFunc(2, add)
# 然后(), 调用 DelayFunc类的 __call__ 方法 ,这里的 __call__ 实际是个闭包
2) 使用装饰器
@delay(duration=2)
def add(a, b):
return a + b
add.eager_call(1, 2) # DelayFunc(2, add).eager_call(1, 2)
add(1, 2) # DelayFunc(2, add)(1,2)
参考于python工匠系列