Python之旅:装饰器
装饰器就是闭包函数的一种应用场景
一、为何要用装饰器
开放封闭原则:软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的
也就是说我们必须找到一种解决方案:能够在不修该一个功能源代码以及调用方式的前提下,为其加上新功能
上述总结,原则如下:
1、不修改源代码
2、不修改调用方式
目的:
在遵循1和2原则的基础上扩展新功能
二、什么是装饰器
器指的工具,装饰指的是为被装饰对象添加新功能
完整含义:
装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能
装饰器与被装饰的对象均可以是任意可调用的对象
装饰器=》函数
被装饰的对象=》函数
三、无参装饰器
#无参装饰器模板 def outer(func): def inner(*args,**kwargs): res=func(*args,**kwargs) return res return inner
1 ###现在我们要查看指令执行的时间 2 #以前实现的方式 3 #违反了装饰器的原则---》不修改源代码 4 import time #导入时间模块 5 6 def index(): 7 start_time=time.time() #现在时间 8 time.sleep(3) #暂停3s 9 print('welcome to index page') 10 stop_time=time.time() #现在的时间(time.sleep与print执行完后的时间) 11 print('run time is %s' %(stop_time-start_time)) 12 13 index() #调用函数 14 15 #修订1 16 #没有违背原则,但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复 17 import time 18 19 def index(): 20 time.sleep(3) 21 print('welcome to index page') 22 23 start_time=time.time() 24 index() 25 stop_time = time.time() 26 print('run time is %s' % (stop_time - start_time)) 27 28 #但是我又要给一个程序加一个同样的这样的功能呢?会体现出现在的代码重复 29 30 import time 31 32 def index(): 33 time.sleep(3) 34 print('welcome to index page') 35 36 def home(name): 37 time.sleep(5) 38 print('welcome %s to home page' %name) 39 40 start_time=time.time() #代码重复 41 index() 42 stop_time = time.time() #代码重复 43 print('run time is %s' % (stop_time - start_time)) #代码重复 44 45 start_time=time.time() 46 home('egon') 47 stop_time = time.time() 48 print('run time is %s' % (stop_time - start_time)) 49 50 #修订2 51 52 # 修改了原函数的调用方式 53 54 import time 55 56 def index(): 57 time.sleep(3) 58 print('welcome to index page') 59 60 def home(name): 61 time.sleep(5) 62 print('welcome %s to home page' %name) 63 64 def wrapper(func): #func=index 65 start_time=time.time() 66 func() #index() 67 stop_time = time.time() 68 print('run time is %s' % (stop_time - start_time)) 69 70 71 wrapper(index) # 修改了原函数的调用方式 72 73 #修订3 74 75 import time 76 77 def index(): 78 time.sleep(3) 79 print('welcome to index page') 80 81 def outter(func): #func=最原始的index 82 # func=最原始的index 83 def wrapper(): 84 start_time=time.time() 85 func() 86 stop_time=time.time() 87 print(stop_time-start_time) 88 return wrapper 89 90 91 index=outter(index) # 新的index=wrapper 92 93 index() #wrapper()
四、无参装饰器升级版
import time def index(): time.sleep(1) print('welcome to index page') return 122 def home(name): time.sleep(2) print('welcome %s to home page' %name) #==============装饰器 def timmer(func): #func=最原始的home def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) #调用最原始的home stop_time=time.time() print(stop_time-start_time) return res return wrapper index=timmer(index) # 新的index=wrapper home=timmer(home) #新的home=wrapper # ========================================== # res=index() #res=wrapper() # print(res) home(name='egon') #wrapper('egon') index() #wrapper()
五、装饰器语法
#就是一个@调用某个装饰器
import time def timmer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print(stop_time-start_time) return res return wrapper @timmer #index=timmer(index) #语法调用方式 def index(): time.sleep(1) print('welcome to index page') return 122 @timmer # home=timmer(home) #语法调用方式 def home(name): time.sleep(2) print('welcome %s to home page' %name) # index() home('egon')
六、认证装饰器实现
七、叠加多个装饰器
八、有参数装饰器
作者:墨颜丶—— 在南方的北方少年郎
签名:当你的才华还撑不起你的野心的时候,你就应该静下心来学习
出处:http://www.cnblogs.com/moyand/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号