python装饰器三种装饰模式的简单分析
学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!
这里就简单讨论下python的几种装饰模式:
一无参装饰器:
#装饰器
importtime
#装饰器,记录函数运行时间
defdecorator01(fun):
defwapper():
stime=time.time()
fun()
etime=time.time()
print("funruntimeis{TIME}".format(TIME=etime-stime))
returnwapper#必须要返回一个函数的内存地址
#使用装饰器装饰某个函数,等价于test01=decorator01(test01),
#即将test01实际引用变成wapper函数内存地址,所以执行test01实际是执行wapper
@decorator01
deftest01():
time.sleep(2)
print("test01isrunning")
test01()#不修改代码和调用方式,实现添加记录时间功能
二函数带参装饰器:
#装饰器
importtime
#装饰器,记录函数运行时间
defdecorator01(fun):
defwapper(*args,**kwargs):#使用非固定参数,无论参数是什么,都可以传递进来
stime=time.time()
fun(*args,**kwargs)
etime=time.time()
print("funruntimeis{TIME}".format(TIME=etime-stime))
returnwapper#必须要返回一个函数的内存地址
#test01()=wapper(),所以装饰器加参数是给嵌套函数加参数
@decorator01
deftest01(args1):
time.sleep(2)
print("参数是{NAME}".format(NAME=args1))
test01("侯征")#不修改代码和调用方式,实现添加记录时间功能
三装饰器本身带参数的装饰器:
#装饰器
importtime
#如果装饰器有参数,最外层是装饰器的参数
defdecorator01(*args,**kwargs):
print("装饰器参数:",*args,**kwargs)
defout(fun):#第二层才是接受的函数
defwapper(*args,**kwargs):#使用非固定参数,无论参数是什么,都可以传递进来
stime=time.time()
fun(*args,**kwargs)
etime=time.time()
print("funruntimeis{TIME}".format(TIME=etime-stime))
returnwapper#必须要返回一个函数的内存地址
returnout#要返回装饰函数的内存地址
#装饰器本身带参数,此时decorator01(arg)=out,即相当于@out装饰test01,所以test01=out(fun)=wapper
@decorator01(1)
deftest01(args1):
time.sleep(2)
print("参数是{NAME}".format(NAME=args1))
test01("侯征")#不修改代码和调用方式,实现添加记录时间功能
这种一开始挺难理解的,但是只要记住一点,@语法糖装饰器的作用就是给被装饰的函数重新赋一个函数的内存地址,即装饰器内部定义的那个
和你直接fun01=decorator(fun),然后fun01()是一样的,只是这样写不用改变原来调用方式
@decorator
deffun():
即就是fun=decorator(fun)所以,当装饰器有参数时,还需要返回一个函数,这个函数才是用来装饰作用的,decorator(1)=out,即fun=out(fun)!!
所以外面再包一层就行了,其实就相当于@decorator(1)=@out,即decorator(1)=out,实际装饰器时out,只不过decorator(1)返回了一个out这样理解就简单多了,无参的@就是起赋值作用
以上就是python装饰器三种装饰模式的简单分析的详细内容,更多关于python装饰模式的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。