python装饰器使用及理解

Posted liuxingpoqiong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python装饰器使用及理解相关的知识,希望对你有一定的参考价值。

装饰器,顾名思义,用来装饰的东西,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!!!
我们做好朋友!!!)
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函数作用域嵌套函数闭包函数高阶函数及装饰器的理解

python笔记-4(装饰器生成器迭代器)

python装饰器

python装饰器

Python之简单理解装饰器

如何理解python装饰器