裝飾器由于斷斷續(xù)續(xù),以及各種資料什么雜亂無(wú)章。
另外。本文章分為三段。基礎(chǔ),進(jìn)階,練習(xí)
如果有一起學(xué)習(xí)的小白同志,可以加群:456926667,一起交流學(xué)習(xí)。
裝飾器概念
裝飾器,說(shuō)白了,就是用來(lái)裝飾函數(shù)的一個(gè)函數(shù)。
裝飾器遵循 開(kāi)放封閉原則
、依賴(lài)倒置原則
,這兩個(gè)原則概念,自行百度下,
裝飾器長(zhǎng)啥樣
def wrapper(f):
def inner(*args,**kwargs):
ret = f(*args,**kwargs)
return ret
return inner
上述代碼是裝飾器的固定格式
調(diào)用裝飾器
@wrapper # 簡(jiǎn)稱(chēng)語(yǔ)法糖
def test():
print(1)
test()
@wrapper
是調(diào)用裝飾器,相比于wrapper(test())
,更節(jié)省代碼,更美觀。可能你看到這里就不懂了,為啥要@wrapper
? 調(diào)用函數(shù)不是wrapper()
?
其實(shí)吧,你要我說(shuō),我也不知道,我就知道,這樣寫(xiě)更簡(jiǎn)單。直接在要裝飾的函數(shù)前@wrapper
即可
以一個(gè)小例子快速看懂裝飾器
def wrapper(f):
print(2)
def inner(*args,**kwargs):
print(3)
ret = f(*args,**kwargs)
print(4)
return ret
return inner
@wrapper
def test():
print(1)
test()
@wrapper
== wrapper(test())
相當(dāng)于調(diào)用裝飾器函數(shù),直接用語(yǔ)法糖@wrapper
會(huì)更簡(jiǎn)便
*args
是匹配以位置傳參的參數(shù),**kwargs
是匹配按關(guān)鍵字傳參的參數(shù),這樣就可以接收所有參數(shù)。
wrapper(test)
接收值傳給f
,在內(nèi)圈函數(shù)中,ret = f(*args,**kwargs)
這函數(shù)是執(zhí)行裝飾的函數(shù)的代碼。再返回執(zhí)行的值,最后返回這個(gè)函數(shù)。此代碼的執(zhí)行結(jié)果為:
2
3
1
4
如下圖所示
由此可見(jiàn)
函數(shù)inner
中,print(3)
是執(zhí)行裝飾函數(shù)前的操作, print(4)
是執(zhí)行裝飾函數(shù)后的操作。
理解起來(lái)可能有些困難。所以最好還是動(dòng)手試試。
基礎(chǔ)小練習(xí)
'''1. 默寫(xiě)裝飾器固定格式
2. 寫(xiě)一個(gè)加減功能的裝飾器
'''