本系列文档:1.终于弄明白了Python的装饰器(一)2.终于弄明白了Python的装饰器(二)3.终于搞懂了Python的装饰器(三))4.终于明白了Python的装饰器(4)3.装饰器应该在什么时候工作?现在有个大问题:我能用装饰器做什么?装饰器看起来很酷很强大,但是展示一个实际的例子会更清楚。使用的场景有1000种可能性。但经典用法是:通过外部库扩展函数的行为(在您无法修改它的情况下)。对调试很有用(你不想修改它,因为它是临时的)。可重用函数可以通过装饰器添加到其他函数中。您可以使用它们以链式方式扩展多个函数,如下所示:defbenchmark(func):"""打印函数执行时间的装饰器。"""importtimedefwrapper(*args,**kwargs):t=time.clock()res=func(*args,**kwargs)print("{0}{1}".format(func.__name__,time.clock()-t))returnresreturnwrapperdeflogging(func):"""装饰器,记录脚本活动。(它实际上只是打印出来,但也许它正在记录!)"""defwrapper(*args,**kwargs):res=func(*args,**kwargs)print("{0}{1}{2}".format(func.__name__,args,kwargs))returnresreturnwrapperdefcounter(func):"""计算并打印函数执行次数的装饰器"""defwrapper(*args,**kwargs):wrapper.count=wrapper.count+1res=func(*args,**kwargs)print("{0}hasbeenused:{1}x".format(func.__name__,wrapper.count))returnreswrapper.count=0returnwrapper@counter@benchmark@loggingdefreverse_string(string):returnstr(reversed(string))print(reverse_string("AblewasIereIsawElba"))print(reverse_string("一个人,计划,独木舟,意大利面,英雄,rajahs,花腔,地图,snipe,percale,通心粉,堵嘴,香蕉袋,棕褐色,标签,再次香蕉袋(或骆驼),绉纱,别针、垃圾邮件、车辙、Rolo、现金、罐子、帽子、工匠、运河:巴拿马!”))#Output:#reverse_string('AblewasIereIsawElba',){}#wrapper0.0#wrapper已被使用:1x#ablEwasIereIsawelbA#reverse_string('Aman,aplan,acanoe,pasta,heroes,rajahs,acoloratura,maps,snipe,percale,macaroni,agag,香蕉袋、棕褐色、标签、香蕉袋(或骆驼)、绉纱、别针、垃圾邮件、车辙、罗洛、现金、罐子、破帽子、工匠、运河:巴拿马!,){}#wrapper0.0#wrapper已被使用:2x#!amanaP:lanaca,noepa,staheros,raja,hsac,oloRa,tura,mapS,snip,eperca,)lemacaro(niagagabananaba,gata,nata,gabananaba,gaga,inoracam,elacrep,epins,spam,arutaroloca,shajar,soreh,atsap,eonaca,nalpa,namA当然,使用的好处装饰器是的,你可以立即在几乎所有东西上使用它们而无需重写例如:@counter@benchmark@loggingdefget_random_futurama_quote():fromurllibimporturlopenresult=urlopen("http://subfusion.net/cgi-bin/quote.pl?quote=futurama").read()try:value=result.split("
")[1].split("
")[0]returnvalue.strip()除了:返回“不,我是……没有!”print(get_random_futurama_quote())print(get_random_futurama_quote())#输出:#get_random_futurama_quote(){}#wrapper0.02#wrapperhasbeenused:1x#Thelawsofsciencebe一个严厉的情妇。#get_random_futurama_quote(){}#wrapper0.01#wrapper已被使用:2x#诅咒你,仁慈的波塞冬!
