python函数之装饰器

  1、装饰器的本质

  装饰器实际上就是对函数中的闭包的一种实际应用,它的本质是一个嵌套函数。

 

  2、装饰器的作用

  装饰器需要满足以下两个条件:

  1)不修改被装饰函数的源代码

  2)不改变被装饰函数的调用方式

  3)给被装饰函数添加新的功能

   总结来说就是在不对被装饰函数有任何影响的情况下让它多出一些功能。

 

  3、装饰器固定格式


1 def timer(func):
2     def inner(*args,**kwargs):
3         '''执行函数之前要做的'''
4         re = func(*args,**kwargs)  #*args、**kwargs将动态参数接收到的元祖解压成分散的个体,re接收被装饰函数中的返回值
5         '''执行函数之后要做的'''
6         return re
7     return inner
8   语法糖:@装饰器函数名 == 被装饰函数名=装饰器函数名(被装饰函数名)
View Code

 



4、开放封闭原则
开发领域中有一个开放封闭原则即对扩展开放,对修改封闭。意思就是一个函数让它扩展新功能,因为之前的开发过程中可能功能需求并没有考虑周全如果不能扩展新功能的话产品就不完善了,
但是如果直接修改源代码则会影响这个函数的其他使用者,所以一般情况下不允许修改源代码

5、带参数的装饰器
带参数的装饰器就是为了给原装饰器传递新的形参,@outer(flag)中
outer(flag)会先执行返回wrapper,然后执行@wrapper。

 1 def outer(flag):
 2     def wrapper(func):
 3         def inner(*args,**kwargs):
 4             if flag:
 5                 '函数调用前执行'
 6                 re =func(*args,**kwargd)
 7                 '函数调用后执行'
 8                 return re
 9             else:
10                  re = func(*args,**kwargs)
11                  return re
12         return inner
13     return wrapper
14 @outer(flag) #outer(flag)会先执行返回wrapper,然后@wrapper
View Code

 



6、多个装饰器装饰一个函数
前面说到@装饰器函数名等价于被装饰函数名 = 装饰器函数名(被装饰函数名),也就是被装饰函数名实际是指向了装饰器函数的内部函数,多个装饰器装饰同一个函数时,前一个装饰器装饰的是
下一个装饰器的内部函数,只有最后的装饰器装饰的是实际的业务函数。
 1 def qqxing(func):  #func = pipixia_inner
 2     def qqxing_inner(*args,**kwargs):
 3         print('in qqxing:before')
 4         ret = func(*args,**kwargs)  #pipixia_inner
 5         print('in qqxing:after')
 6         return ret
 7     return qqxing_inner
 8 
 9 def pipixia(func):  #dapangxie
10     def pipixia_inner(*args,**kwargs):
11         print('in pipixia:before')
12         ret = func(*args,**kwargs)      #dapangxie
13         print('in pipixia:after')
14         return ret
15     return pipixia_inner
16 
17 #qqxing(pipixia_inner)  -->dapangxie = qqxing_inner()
18 @qqxing    #dapangxie = qqxing(dapangxie)  -->dapangxie = qqxing(pipixia(dapangxie)) -->
19 @pipixia   #dapangxie = pipixia(dapangxie)
20 def dapangxie():
21     print("饿了么")
22 dapangxie()
View Code

 


 

posted @ 2017-07-27 15:53  魅力宁波  阅读(227)  评论(0)    收藏  举报