装饰器的前身今世

装饰器实现的是在不改变方法原来调用的方式、代码的情况下,
 给这个函数的前后加一些功能进行装饰,以为原方法实现调用前后添加打印日志功能为例

演练过程

 

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()

 

posted on 2018-03-22 16:17  星际无垠  阅读(84)  评论(0)    收藏  举报