22_装饰器、带参数的装饰器、多个装饰器装饰一个函数

一、装饰器的执行流程

 1 def wrapper(func):
 2     def inner(*args,**kwargs):
 3         ret = func(*args,**kwargs)
 4         return ret
 5     return inner
 6 
 7 @wrapper   #fun = wrapper(fun)
 8 def fun(s):
 9     print('666')
10     return s
11 
12 fun('777')
13 print(fun('777'))
14 
15 '''
16 1.程序至上而下,遇到wrapper() 保存到内存中
17 2.@wrapper   ==   fun = wrapper(fun)  
18 3.执行wrapper(fun)   --> return inner
19 4.return  inner  --->  fun = inner
20 5.fun = inner
21 6.把fun()放到内存中
22 7.执行fun()  ->  inner()
23 8.print('666')
24 9.renturn ret --> return s
25 '''
装饰器执行流程

二、开放封闭原则

关于开放封闭原则,其核心的思想是:
软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。
因此,开放封闭原则主要体现在两个方面:
对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。
装饰器完美吻合这一原则,在不改变被修饰函数以及业务逻辑前提下,额外的添加功能。

三、带参数的装饰器

 1 import time
 2 
 3 flag = False
 4 def out(flag):
 5     flag = flag
 6     def wrapper(func):
 7         def inner(*args,**kwargs):
 8             if flag:
 9                 start_time = time.time()
10                 time.sleep(1)
11                 ret = func(*args,**kwargs)
12                 end_time = time.time()
13                 return end_time - start_time
14             else:
15                 func(*args,**kwargs)
16         return inner
17     return wrapper
18 
19 @out(True)  #out(True/False)   ->  返回的是wrapper ===>>>  @wrapper
20 def func():
21     print('666')
22 
23 func()

四、多个装饰器装饰一个函数

 1 def wrapper1(func):
 2     def inner1(*args,**kwargs):
 3         print('wrapper1  before')
 4         func()
 5         print('wrapper1  after')
 6     return inner1
 7 
 8 def wrapper2(func):
 9     def inner2(*args,**kwargs):
10         print('wrapper2  before')
11         func()  #wrapper1 的 inner
12         print('wrapper2  after')
13     return inner2
14 
15 @wrapper2  # func() = wrapper2(func)  -> inner2
16 @wrapper1 # func = wrapper1(func)  wrapper1的inner
17 def func():
18     print('6666')
19 
20 func()

执行流程:

 1 '''
 2 1.执行wrapper1 -> func = wrapper1(func) -> func = inner1(func)
 3 2.执行wrapper2 -> func = wrapper2(func) -> func = inner2(inner1)
 4 
 5 3. -> fun()==>inner2   : print('wrapper2  before') 
 6 4. func()  wrapper2 中的func()实际上是wrapper1的inner     print('wrapper1  before')
 7 6. 执行wrapper1 中的 func()  --->   6666  
 8 7.执行完wrapper1中的func() 继续往下,执行print('wrapper1  after')
 9 7.执行完inner1  之后,返回,程序继续往下执行  print('wrapper2  after')
10 '''

 

posted @ 2018-02-05 16:23  短毛兔  阅读(262)  评论(0编辑  收藏  举报