一、装饰器的执行流程
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 [email protected] == 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()
四、多个装饰器装饰一个函数