装饰器
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))
浙公网安备 33010602011771号