装饰器

 1 #!/usr/bin/env python
 2 # -*- encoding:utf-8 -*-
 3 # 装饰器模式与动态代理的区别:
 4 # 装饰器模式可以在不增加新的装饰类的情况下对已有的功能进行组合而得到新的功能,但得修改客户端代码才能使用新的功能
 5 # 动态代理则是增加一个新的类来实现功能,哪怕这个功能是对已有功能的组合,但可以不用修改客户端代码。
 6 # 区别:1.增不增加新类。2 是否需要更改客户端代码。
 7 def outter(func):   # 方法名:指向方法的内存地址   方法名():执行方法
 8     def inner():
 9         print('before')
10         result = func()
11         print('after')
12         return result
13 
14     return inner    # 返回方法名,指向方法的内存地址  index重新指向inner方法的内存地址
15  
16 # @+方法名
17 @outter  # 函数应用装饰器 那么函数就被重新定义 重新定义为装饰器的内层函数 对index()方法前后进行操作,index重新指向inner方法的内存地址
18 def index():
19     print('index')
20     return True
21 
22 # 调用方法 会先执行ouuter方法,index()方法的方法名是outter方法的参数
23 flag = index()
24 print(flag)

 万能装饰器

 1 #!/usr/bin/env python
 2 # -*- encoding:utf-8 -*-
 3 
 4 # 万能装饰器
 5 def outter(func):
 6     # *args 元组,元组的元素 **kwargs 字典   
 7     def inner(*args, **kwargs):
 8         print('before')
 9         # python内部已经进行了优化 所以不需要额外的操作
10         result = func(*args, **kwargs)  
11         print(args, kwargs)
12         print('after')
13         return result
14 
15     return inner
16 
17 
18 @outter
19 def sum(a, b):
20     return a + b;
21 
22 
23 @outter
24 def sum2(a, b, c):
25     return a + b + c;
26 
27 
28 print(sum(1, 2))
29 
30 print(sum2(1, 2, 3))

 一个方法多个装饰器

 1 #!/usr/bin/env python
 2 # -*- encoding:utf-8 -*-
 3 
 4 # 万能装饰器
 5 def outter(func):
 6     # *args 元组,元组的元素 **kwargs 字典
 7     def inner(*args, **kwargs):
 8         print('before')
 9         # python内部已经进行了优化 所以不需要额外的操作
10         result = func(*args, **kwargs)
11         print(args, kwargs)
12         print('after')
13         return result
14 
15     return inner
16 
17 
18 def outter2(func):
19     # *args 元组,元组的元素 **kwargs 字典
20     def inner2(*args, **kwargs):
21         print('outter2')
22         result = func(*args, **kwargs)
23         return result
24 
25     return inner2
26 
27 
28 # 执行流程 装饰器嵌套
29 # 先执行outter方法  sum指向outter内部的inner方法的内存地址,然后再执行outter2方法,sum指向outter2内部的inner2方法的内存地址
30 @outter2
31 @outter
32 def sum(a, b):
33     return a + b;
34 
35 
36 @outter
37 def sum2(a, b, c):
38     return a + b + c;
39 
40 
41 print(sum(1, 2))

 

posted on 2018-01-16 11:23  jovelove  阅读(83)  评论(0)    收藏  举报