装饰器,顾名思义,用来装饰的东西,python中装饰器是指用来拓展函数功能的一种函数
优点:不用变更原函数的结构而是原函数拥有新的功能
如:
1 def a():2 print('我们做好朋友!!!')
执行函数:a()返回值:
我们做好朋友
想在这个函数的结果返回结果前加上一句话:“Hello!”,使得结果为:
Hello!!!
我们做好朋友!!!
第一种方法:在函数里面加代码,如:
1 def a():2 print("Hello!!!")3 print('我们做好朋友!!!')
或者:
1 def a():2 print('Hello!!!\n我们做好朋友!!!')
都可以 完成结果显示
但是这么做有一个弊端,那就是侵入了核心代码,而且代码量大的情况下更改会容易改错和花费大量的人力资源和时间资源
那么这时候就可以使用装饰器:
首先可以这样:
1 def b(fun):2 print("Hello!!!")3 fun()4 5 def a():6 print('我们做好朋友!!!')7 8 b(a)
这样执行结果实现了,但是会发现需要执行的程序由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()
这样就实现了所需要的结果,而且没有改变函数结果和执行函数,只需在原函数前面加上@装饰函数就可以了
拓展了原来函数的功能既不需要侵入函数内更改代码,也不需要重复执行原函数。
有些函数会带参数,如原函数:
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')
当函数为多个的时候也是可以的:
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')
同一个函数也可以加多个装饰器,如:
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")
执行结果为:
-----------------------------------###################################这是第一个装饰器!!!111111111================================这是第二个装饰器!!!11111111111111111111111++++++++++++++++++++++++++++++++++++++++++Hello,tom and jimThis is C!!!!!!!Who are this????这是第二个装饰器!!!22222222222222222222222!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!这是第一个装饰器!!!222222222%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
从执行结果可以看出多个装饰器执行的顺序是:
多个装饰器执行的顺序就是从最后一个装饰器开始,执行到第一个装饰器,再执行函数本身。