博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器使用及理解
阅读量:4982 次
发布时间:2019-06-12

本文共 2821 字,大约阅读时间需要 9 分钟。

装饰器,顾名思义,用来装饰的东西,python中装饰器是指用来拓展函数功能的一种函数

优点:不用变更原函数的结构而是原函数拥有新的功能

如:

1 def a():2     print('我们做好朋友!!!')
View Code

 

执行函数:a()返回值:

我们做好朋友

想在这个函数的结果返回结果前加上一句话:“Hello!”,使得结果为:

Hello!!!

我们做好朋友!!!

第一种方法:在函数里面加代码,如:

1 def a():2     print("Hello!!!")3     print('我们做好朋友!!!')
View Code

或者:

1 def a():2     print('Hello!!!\n我们做好朋友!!!')
View Code

都可以 完成结果显示

但是这么做有一个弊端,那就是侵入了核心代码,而且代码量大的情况下更改会容易改错和花费大量的人力资源和时间资源

那么这时候就可以使用装饰器:

首先可以这样:

1 def b(fun):2     print("Hello!!!")3     fun()4 5 def a():6     print('我们做好朋友!!!')7 8 b(a)
View Code

这样执行结果实现了,但是会发现需要执行的程序由a()变成了b(a),又更改了整个代码结构

而且如果要给n多个函数加装饰又会很不方便,需要将n多个原函数带入新函数中

根据以上方法可以这样做:

1 def c(fun): 2     def b(): 3         print("Hello!!!") 4         fun() 5     return b 6  7 @c 8 def a(): 9     print('我们做好朋友!!!')10 11 a()
View Code

这样就实现了所需要的结果,而且没有改变函数结果和执行函数,只需在原函数前面加上@装饰函数就可以了

拓展了原来函数的功能既不需要侵入函数内更改代码,也不需要重复执行原函数。

有些函数会带参数,如原函数:

def a(x,y):    print('%s,%s,我们做好朋友!!!'%(x,y))

要加装饰器也只需要给装饰器加上参数即可,如下代码:

1 def c(fun): 2     def b(x,y): 3         print("Hello!!!") 4         fun(x,y) 5     return b 6  7 @c 8 def a(x,y): 9     print('%s,%s,我们做好朋友!!!'%(x,y))10 11 a('bob','jim')
View Code

当函数为多个的时候也是可以的:

1 def c(fun): 2     def b(*args,**kwargs): 3         print("Hello!!!") 4         fun(*args,**kwargs) 5     return b 6  7 @c 8 def d(q): 9     print("%s,哈哈哈!!!"%q)10 11 @c12 def a(x,y,m,n):13     print('%s,%s,%s,%s,我们做好朋友!!!'%(x,y,m,n))14 15 d('玩去')16 a('bob','jim','tom','lily')
View Code

同一个函数也可以加多个装饰器,如:

1 def dec1(fun): 2     print("###################################") 3     def y(*args,**kwargs): 4         print("这是第一个装饰器!!!111111111") 5         print("================================") 6         fun(*args,**kwargs) 7         print("这是第一个装饰器!!!222222222") 8         print("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") 9     return y10 11 def dec2(xun):12     print("-----------------------------------")13     def u(*args,**kwargs):14         print("这是第二个装饰器!!!11111111111111111111111")15         print("++++++++++++++++++++++++++++++++++++++++++")16         xun(*args,**kwargs)17         print("这是第二个装饰器!!!22222222222222222222222")18         print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")19     return u20 21 @dec122 @dec223 def c(m,n):24     print('Hello,%s and %s'%(m,n))25     print("This is C!!!!!!!")26     print("Who are this????")27 28 c("tom","jim")
View Code

执行结果为:

-----------------------------------###################################这是第一个装饰器!!!111111111================================这是第二个装饰器!!!11111111111111111111111++++++++++++++++++++++++++++++++++++++++++Hello,tom and jimThis is C!!!!!!!Who are this????这是第二个装饰器!!!22222222222222222222222!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!这是第一个装饰器!!!222222222%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

从执行结果可以看出多个装饰器执行的顺序是:

多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。

 

转载于:https://www.cnblogs.com/liuxingpoqiong/p/9405557.html

你可能感兴趣的文章
Java基于Tomcat Https keytool 自签证书
查看>>
机房收费调试问题(一)
查看>>
Perl多进程处理Web日志
查看>>
Oracle中MD5+Base64加密实现
查看>>
linux 编辑文档
查看>>
Java中ArrayList类的用法(转)
查看>>
作业5 指针应用1。
查看>>
关于JAVA项目中的常用的异常处理情况总结
查看>>
字段类型的选择原则
查看>>
StructLayoutLayout 属性无法通过GetCustomAttributes 或者 Attributes获得
查看>>
如何一键收藏微信文章?
查看>>
二维码图片以字符串的形式保存DB,已文件流显示页面上
查看>>
install
查看>>
好久没有写东西了发一个1年前写的东西
查看>>
Struts2、Spring、Hibernate 高效开发的最佳实践(转载)
查看>>
使用cmd查看电脑连接过的wifi密码并将密码发送至指定邮箱(三)
查看>>
u3d 场景资源打包
查看>>
123
查看>>
hdu 1874
查看>>
最优比例生成树最优比率生成树 01分数规划问题
查看>>