码迷,mamicode.com
首页 > 编程语言 > 详细

python装饰器使用及理解

时间:2018-08-02 11:22:04      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:图片   python   弊端   %s   color   who   fda   this   一句话   

装饰器,顾名思义,用来装饰的东西,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 @c
12 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 y
10 
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 u
20 
21 @dec1
22 @dec2
23 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 jim
This is C!!!!!!!
Who are this????
这是第二个装饰器!!!22222222222222222222222
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这是第一个装饰器!!!222222222
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

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

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

 

python装饰器使用及理解

标签:图片   python   弊端   %s   color   who   fda   this   一句话   

原文地址:https://www.cnblogs.com/liuxingpoqiong/p/9405557.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!