如何实现一个python函数装饰器(Decorator)
装饰器本质上是一个Python函数或类,它可以让其他函数或类在不需要做任何代码修改的前提下增加额外功能,装饰器的返回值也是一个函数/类对象。它经常用于为已有函数/类添加记录日志、计时统计、性能测试等。
首先定义一个倒计时函数,这个函数的功能非常简单,就是把n从当前值减少到0。
defcountdown(n): whilen>0: print('time'+str(n)) n-=1 print(countdown.__name__)
程序输出:
countdown
1.为函数增加一个日志装饰器
假设现在要增强countdown的功能,在函数调用前后自动打印日志,又不想修改函数自身的功能。这种在代码运行期间动态增加功能的方式,称之为装饰器(Decorator)。
能打印日志的decorator,可以定义如下:
deflog(func): defwrapper(*args,**kw): print('call%s().'%func.__name__) returnfunc(*args,**kw) returnwrapper
然后我们借助Python的@语法,把decorator置于函数的定义处:
@log defcountdown(n): whilen>0: print('time:'+str(n)) n-=1 countdown(10)
程序输出:
callcountdown().
time:10
time:9
time:8
time:7
time:6
time:5
time:4
time:3
time:2
time:1
但此时我们再打印函数的name:
print(countdown.__name__)
程序输出:
wrapper
我们发现函数的元数据信息变了,这显然不是我们想要的结果。
2.在装饰器中拷贝元数据
为了把函数的元数据信息都保留下来,我们可以直接使用Python提供的functools库中的@wraps装饰器。
fromfunctoolsimportwraps deflog(func): @wraps(func) defwrapper(*args,**kw): print('call%s().'%func.__name__) returnfunc(*args,**kw) returnwrapper @log defcountdown(n): whilen>0: print('time:'+str(n)) n-=1 print(countdown.__name__)
程序输出:
countdown
3.为函数增加一个计时装饰器
添加函数装饰器的方法已经讲清楚了,现在再实现一个完整的函数计时耗时装饰器。
importtime fromfunctoolsimportwraps defTimeCost(func): @wraps(func) defwrapper(*arg,**kwargs): start=time.time() result=func(*args,**kwargs) end=time.time() print(func.__name__,end-start) returnresult returnwrapper @TimeCost defcountdown(n): whilen>0: print('time:'+str(n)) n-=1 countdown(10000)
函数输出:
('countdown',0.0004801750183105469)
参考资料:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017451662295584
PythonCookbook中文版
以上就是如何实现一个python函数装饰器(Decorator)的详细内容,更多关于python函数装饰器的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。