装饰器
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def wrapper(func): # 1 2 def inner(): # 4 3 print("开始") # 8 4 func() # 9 5 print("结束") # 11 6 return inner # 5 7 8 def haha(): # 2 9 print('aaaaa') # 10 10 11 12 haha = wrapper(haha) # 3/6 13 haha() # 7
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def wrapper(func): 2 def inner(*args, **kwargs): 3 #函数执行之前的内容扩展''' 4 ret = func(*args, **kwargs) 5 #函数执行之后的内容扩展 6 return ret 7 return inner 8 9 @wrapper # =====>aaa=wrapper(aaa) 10 def aaa(x): 11 print(x) 12 aaa(123)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# 带参数的装饰器:(相当于开关)为了给装饰器传参 # F=True#为True时就把装饰器给加上了 F=False#为False时就把装饰器给去掉了 def outer(flag): def wrapper(func): def inner(*args,**kwargs): if flag: print('before') ret=func(*args,**kwargs) print('after') else: ret = func(*args, **kwargs) return ret return inner return wrapper @outer(F) # wrapper = outer(F) def hahaha(): print('hahaha') @outer(F) def shuangwaiwai(): print('shuangwaiwai') hahaha() shuangwaiwai()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def qqqxing(fun): 2 def inner(*args,**kwargs): 3 print('in qqxing: before') 4 ret = fun(*args,**kwargs) 5 print('in qqxing: after') 6 return ret 7 return inner 8 9 def pipixia(fun): 10 def inner(*args,**kwargs): 11 print('in pipixia: before') 12 ret = fun(*args,**kwargs) 13 print('in pipixia: after') 14 return ret 15 return inner 16 @qqqxing 17 @pipixia 18 def dapangxie(): 19 print('饿了吗') 20 dapangxie() 21 22 ''' 23 运行结果: 24 in qqxing: before 25 in pipixia: before 26 饿了吗 27 in pipixia: after 28 in qqxing: after 29 ''' 30 ''' 31 @qqqxing和@pipixia的执行顺序:先执行qqqxing里面的 print('in qqxing: before'),然后跳到了pipixia里面的 32 print('in pipixia: before') 33 ret = fun(*args,**kwargs) 34 print('in pipixia: after'),完了又回到了qqqxing里面的 print('in qqxing: after')。所以就如下面的运行结果截图一样 35 '''
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
l=[] def wrapper(fun): l.append(fun)#统计当前程序中有多少个函数被装饰了 def inner(*args,**kwargs): # l.append(fun)#统计本次程序执行有多少个带装饰器的函数被调用了 ret = fun(*args,**kwargs) return ret return inner @wrapper def f1(): print('in f1') @wrapper def f2(): print('in f2') @wrapper def f3(): print('in f3') print(l)
开放封闭原则
1.对扩展是开放的
2.对修改是封闭的
装饰器的固定格式
def timer(func):
def inner(*args,**kwargs):
#在函数前执行的代码
ret=func(*args,**kwargs)
#在函数前执行的代码
return ret
return inner
@timer #函数1=timer(函数1)
def 函数名1():
pass
@timer #函数2=timer(函数2)
def 函数名2():
pass
函数名1()
函数名2()
装饰器的主要功能:
- 在不改变函数调用方式的基础上在函数的前、后添加功能。
- 本质:一个闭包函数