Python學習之裝飾器進階
阿新 • • 發佈:2017-07-30
放大 python學習 else pen 裝飾 dap style pri aaa
函數知識回顧:
函數的參數分為:實參和形參。
實參:調用函數的時候傳入的參數;
形參:分為3種(位置參數、默認參數、動態傳參)
位置參數:必須傳值
def aaa(a,b): print(a,b) aaa(1,2)
默認參數:不是必須傳參數
def bbb(x=10): print(x) # bbb() #x = 10 # bbb(20) #x = 20
動態傳參
def ccc(*args):#1,2,3,4,5 print(args) ccc(1,2,3,4,5)#按位置傳參數 t = (1,2,3,4,5) ccc(t) ((1, 2, 3, 4, 5),) ccc(*t) (1, 2, 3, 4, 5)
def ddd(**kwargs): print(kwargs) # ddd(k = ‘a‘,j = ‘b‘)#按關鍵字傳參數
def eee(*args,**kwargs): print(args,kwargs) # eee(12,123) #先按位置傳參,再按關鍵字傳參
def ccc(*args): print(‘ccc:‘,args) #(1,2,3,4,5)聚合 def inner(a,b,c,d,e): print(‘inner‘,a,b,c,d,e) inner(*args) #*(1,2,3,4,5) 打散
裝飾器(完整解釋版)
def wrapper(func): def inner(*args,**kwargs):#定義函數的時候——*參數的聚合 ret = func(*args,**kwargs) #調用函數的時候——*參數的打散 #func是被裝飾的函數,ret是被裝飾函數的返回值 return ret #把被裝飾的函數的返回值返回給調用者 return inner @wrapper #hahaha = wrapper(hahaha) def hahaha(a,b): returna+1,b+1 ret = hahaha(1,2) print(ret)
裝飾器的高級應用:一個裝飾器被幾個函數調用和一個裝飾器被調用的次數、一個函數被多個裝飾器裝飾、帶參數的裝飾器。
一個裝飾器被幾個函數調用:
l=[]#存放調用的函數 def wrapper(func): l.append(func)#統計有幾個函數調用 def inner(*args,**kwargs): ret=func(*args,**kwargs) return ret return inner @wrapper def f1(): print(‘in f1‘) @wrapper def f2(): print(‘in f2‘) print(l)
一個裝飾器被調用的次數:
l=[]#存放調用的函數 def wrapper(func): # l.append(func)#統計有幾個函數調用 def inner(*args,**kwargs): l.append(func)#統計被調用了幾次 ret=func(*args,**kwargs) return ret return inner @wrapper def f1(): print(‘in f1‘) @wrapper def f2(): print(‘in f2‘) f1() f1() f2() f2() print(l)
一個函數被幾個裝飾器裝飾:
def qqxing(func): def inner(*args,**kwargs): print(‘before,inqqxing‘) ret= func(*args,**kwargs) print(‘inqqxing,after‘) return ret return inner def pipia(func): def inner(*args,**kwargs): print(‘beore,pipia‘) ret=func(*args,**kwargs) print(‘after ,pipia‘ ) return ret return inner @qqxing @pipia def dapangxie(): print(‘餓了麽‘) dapangxie()
放大招帶參數的裝飾器:
F=True#裝飾器的參數 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) def hahaha(): print(‘hahaha‘) @outer(F) def shuang(): print(‘shuag‘) shuang() hahaha()
Python學習之裝飾器進階