装饰器的前身今世
装饰器实现的是在不改变方法原来调用的方式、代码的情况下,
给这个函数的前后加一些功能进行装饰,以为原方法实现调用前后添加打印日志功能为例
演练过程
Version1:最原始的作法,修改函数代码
1 #_*_encoding:utf-8_*_ 2 import time 3 4 def run(): 5 print("----------Start time:%s--------"%time.time()) 6 7 print("this is run methed invoked....") 8 time.sleep(1) 9 10 print("----------End time %s-----------"%time.time()) 11 12 def eat(): 13 print("----------Start time:%s--------" % time.time()) 14 15 print("this is eat methed invoked....") 16 time.sleep(2) 17 18 print("----------End time %s-----------" % time.time()) 19 20 run() 21 eat()
Version2:将重复的代码抽离成方法当作参数传入,改变原来方法的调用形式
1 #_*_encoding:utf-8_*_ 2 import time 3 4 def startTime(): 5 print("----------Start time:%s--------" % time.time()) 6 7 def endTime(): 8 print("----------End time %s-----------" % time.time()) 9 10 11 def run(s,e): 12 s() 13 print("this is run methed invoked....") 14 time.sleep(1) 15 e() 16 17 def eat(s,e): 18 s() 19 print("this is eat methed invoked....") 20 time.sleep(2) 21 e() 22 23 run(startTime,endTime) 24 eat(startTime,endTime)
Version 3 将重复的代码抽离成一个方法,将原来的方法调用嵌入到新的方法中
1 #_*_encoding:utf-8_*_ 2 import time 3 4 def logger(func): 5 print("----------Start time:%s--------" % time.time()) 6 func() 7 print("----------End time %s-----------" % time.time()) 8 9 10 def run(): 11 print("this is run methed invoked....") 12 time.sleep(1) 13 14 def eat(): 15 16 print("this is eat methed invoked....") 17 time.sleep(2) 18 19 logger(run) 20 logger(eat)
Version 4 使用闭包
1 #_*_encoding:utf-8_*_ 2 import time 3 4 5 def logger(func): 6 def inner(): 7 print("----------Start time:%s--------" % time.time()) 8 func() 9 print("----------End time %s-----------" % time.time()) 10 return inner 11 12 def run(): 13 print("this is run methed invoked....") 14 time.sleep(1) 15 16 def eat(): 17 18 print("this is eat methed invoked....") 19 time.sleep(2) 20 21 run = logger(run) 22 run() 23 24 eat = logger(eat) 25 eat()
Version 5:优雅的使用闭包 @ 还是要改原代码,要在方法定义的时候加上一个装饰器的调用定义
1 #_*_encoding:utf-8_*_ 2 import time 3 4 def logger(func): 5 def inner(): 6 print("----------Start time:%s--------" % time.time()) 7 func() 8 print("----------End time %s-----------" % time.time()) 9 return inner 10 11 @logger #run = logger(run) 12 def run(): 13 print("this is run methed invoked....") 14 time.sleep(1) 15 16 @logger 17 def eat(): 18 print("this is eat methed invoked....") 19 time.sleep(2) 20 21 run() 22 eat()
Version6 :带参数的方法应用装饰器
1 #_*_encoding:utf-8_*_ 2 import time 3 4 def logger(func): 5 def inner(*args,**kwargs): 6 print("----------Start time:%s--------" % time.time()) 7 func(*args,**kwargs) 8 print("----------End time %s-----------" % time.time()) 9 return inner 10 11 @logger #run = logger(run) 12 def run(name,distance,unit="kilemeters"): 13 print("this is run methed invoked....") 14 print("%s runned %s %s..."%(name,distance,unit)) 15 time.sleep(1) 16 17 @logger 18 def eat(): 19 print("this is eat methed invoked....") 20 time.sleep(2) 21 22 run("jay",10,unit="meters") 23 eat()
Version 7 :装修器和方法都带参数的应用,实现装饰器功能可配置
1 #_*_encoding:utf-8_*_ 2 import time 3 4 def logger(flag=True): 5 def isLogger(func): 6 def inner(*args,**kwargs): 7 if flag: 8 print("----------Start time:%s--------" % time.time()) 9 func(*args,**kwargs) 10 print("----------End time %s-----------" % time.time()) 11 else: 12 func(*args, **kwargs) 13 return inner 14 return isLogger 15 16 17 @logger() #logger(flag=True) run = isLogger(run) 18 def run(name,distance,unit="kilemeters"): 19 print("this is run methed invoked....") 20 print("%s runned %s %s..."%(name,distance,unit)) 21 time.sleep(1) 22 23 @logger(False) 24 def eat(): 25 print("this is eat methed invoked....") 26 time.sleep(2) 27 28 run("jay",10,unit="meters") 29 eat()
浙公网安备 33010602011771号