裝飾器萬能模板
裝飾器函數(shù)的本質(zhì):閉包函數(shù)
def wrapper(func): #裝飾器函數(shù)敞掘,func為被裝飾函數(shù)
def inner(*args,**kwargs):
"""被裝飾函數(shù)前需要添加的內(nèi)容"""
ret=func(*args,**kwargs) #被裝飾函數(shù)
"""被裝飾函數(shù)后需要添加的內(nèi)容"""
return ret
return inner
*args :按照位置傳值塞淹,多余的參數(shù)都給args界阁,以元祖的形式存儲
**kwargs :按照關(guān)鍵字傳值,多余的參數(shù)個kwargs身弊,以字典的形式存儲
使用方法
@wrapper
def fun():
print('你好')
@wrapper 被稱為語法糖娃弓,@+裝飾器函數(shù)名稱典格,寫在函數(shù)上放,裝飾距離最近的函數(shù)台丛。
此符號等價于fun=wrapper(fun)
再次執(zhí)行被裝飾函數(shù)時钝计,實(shí)際執(zhí)行的是裝飾器內(nèi)部函數(shù)inner
裝飾器優(yōu)勢
可以在不改變原函數(shù)的的基礎(chǔ)上為函數(shù)添加新的功能,滿足對拓展是開放的,對修改是封閉的原則私恬。
裝飾器進(jìn)階
1. 帶參數(shù)裝飾器
如果想使用@wrapper(flag)類似這樣帶參數(shù)的裝飾器债沮,需要在裝飾器外層再嵌套一層函數(shù),然后return之前的wrapper函數(shù)本鸣。
def out_wrapper(flag):
def wrapper(func): #裝飾器函數(shù)疫衩,func為被裝飾函數(shù)
def inner(*args,**kwargs):
"""被裝飾函數(shù)前需要添加的內(nèi)容"""
ret=func(*args,**kwargs) #被裝飾函數(shù)
"""被裝飾函數(shù)后需要添加的內(nèi)容"""
return ret
return inner
return wrapper
2. 多個裝飾器調(diào)用
def wrapper1(func):
def inner(*args,**ksargs):
print('wrapper1')
ret=func()
print('wrapper1')
return ret
return inner
def wrapper2(func):
def inner(*args,**ksargs):
print('wrapper2')
ret=func()
print('wrapper2')
return ret
return inner
def wrapper3(func):
def inner(*args,**ksargs):
print('wrapper3')
ret=func()
print('wrapper3')
return ret
return inner
@wrapper3
@wrapper2
@wrapper1
def fun():
print('func1')
fun()
多個裝飾器,運(yùn)行順序是從距離被裝飾函數(shù)最近的一個裝飾器開始的荣德,即從wrapper1闷煤,wrapper2,wrapper3涮瞻,一層一層嵌套鲤拿,但從打印的結(jié)果可知,在被裝飾函數(shù)之前運(yùn)行的是從外到內(nèi)的順序署咽,之后運(yùn)行的是從內(nèi)到外的順序近顷,類似套娃的結(jié)構(gòu)。
打印結(jié)果如下:
wrapper3
wrapper2
wrapper1
func1
wrapper1
wrapper2
wrapper3