classlogger(object):def__init__(self, func):
self.func = func
def__call__(self,*args,**kwargs):print("[INFO]: the function {func}() is running...".format(func=self.func.__name__))return self.func(*args,**kwargs)
@logger
defsay(something):print("say {}!".format(something))if __name__ =='__main__':
say("hello")>>>>>[INFO]: the function say()is running...>>>>> say hello!
classlogger(object):def__init__(self, level='INFO'):
self.level = level
def__call__(self, func):# 接受函数defwrapper(*args,**kwargs):print("[{level}]: the function {func}() is running...".format(level=self.level, func=func.__name__))
func(*args,**kwargs)return wrapper # 返回函数
@logger(level='WARNING')defsay(something):print("say {}!".format(something))if __name__ =='__main__':
say("hello")>>>>>[WARNING]: the function say()is running...>>>>> say hello!
(7)使用偏函数与类实现装饰器
import time
import functools
classDelayFunc:def__init__(self, duration, func):
self.duration = duration
self.func = func
def__call__(self,*args,**kwargs):print(f'Wait for {self.duration} seconds...')
time.sleep(self.duration)return self.func(*args,**kwargs)defeager_call(self,*args,**kwargs):print('Call without delay')return self.func(*args,**kwargs)defdelay(duration):"""
装饰器:推迟某个函数的执行。
同时提供 .eager_call 方法立即执行
"""# 此处为了避免定义额外函数,# 直接使用 functools.partial 帮助构造 DelayFunc 实例return functools.partial(DelayFunc, duration)
@delay(duration=2)defadd(a, b):return a + b
if __name__ =='__main__':print(add)
add(3,5)print(add.func)>>>>><__main__.DelayFunc object at 0x0000000001F71A20>>>>>> Wait for2 seconds...>>>>><function add at 0x0000000001FC81E0>