python函數四(裝飾器進階)
阿新 • • 發佈:2018-02-05
開放 int col wrap 運行 lag 分享 none name
一。開放封閉原則
1.對擴展是開放的
任何一個程序,不可能在設計之初就已經想好了所有的功能並且未來不做任何更新和修改。所以我們必須允許代碼擴展、添加新功能。
2.對修改是封閉的
比如我們寫的一個函數,很有可能已經交付給其他人使用了,如果這個時候我們對其進行了修改,很有可能影響其他已經在使用該函數的用戶。
裝飾器完美的遵循了開放封閉原則。
二。函數的有用信息
def func(): ‘‘‘ 本函數主要用於繪圖,實時接收數據 :return:返回給前端某標簽 ‘‘‘ print(func.__doc__) print(func.__name__) func() # 結果: # 本函數主要用於繪圖,實時接收數據 # :return:返回給前端某標簽 # func
三。*args,**kwargs
def wrapper(func): def inner(*args,**kwargs): ‘‘‘執行函數前‘‘‘ ret = func(*args,**kwargs) ‘‘‘執行函數後‘‘‘ return ret return inner @wrapper def func(a,b,c,d): #接收函數時,加個*聚合 print(111) func(1,2,3,4) # f1(*[1,2,3,4]) #執行函數時,加個*打散
四。裝飾器進階
1.帶參數的裝飾器
flag = True def wrapper_out(flag): def wrapper(func): def inner(*args,**kwargs): ‘‘‘執行函數前‘‘‘ if flag: ret = func(*args,**kwargs) ‘‘‘執行函數後‘‘‘ printView Code(222) return ret else: ret = func() return ret return inner return wrapper @wrapper_out(flag) #第一步是調用 wrapper_out(flag),接收到返回值wrapper def func(): #第二步是@wrapper,即func = wrapper(func) print(111) func() # 輸出結果: # 111 # 222 # 當flag = False時,調用inner()時走else # 輸出結果: 111
2.多個裝飾器裝飾一個函數
def wrapper1(func): def inner1(*args,**kwargs): ‘‘‘執行函數前‘‘‘ print(222) ret1 =func(*args,**kwargs) ‘‘‘執行函數後‘‘‘ print(333) return ret1 return inner1 def wrapper2(func): def inner2(*args,**kwargs): ‘‘‘執行函數前‘‘‘ print(555) ret2 = func(*args,**kwargs) ‘‘‘執行函數後‘‘‘ print(666) return ret2 return inner2 @wrapper1 @wrapper2 def func(): print(111) func() #運行到@wrapper1時此時不運行,走下一步 #運行到@wrapper2時,func = wrapper2(func),此時得到的是 func = wrapper2(func),返回值是inner2 ,即func---->inner2 #之後再運行到@wrapper1,即func = wrapper1(inner2),返回值是inner1,即func----->inner1 #接著調用func(),即調用inner1() # #再根據自上而下的運行規律即可以得到結果 # 輸出結果: # 222 # 555 # 111 # 666 # 333View Code
python函數四(裝飾器進階)