python裝飾器
剛剛接觸python的裝飾器,簡直懵逼了芬位,直接不懂什么意思啊有木有无拗,自己都忘了走了多少遍Debug,查了多少遍資料昧碉,才有點(diǎn)點(diǎn)開始明白了英染。
待會我將會和大家一起通過代碼的形式來迷你銀行存款取款的功能被饿,然后通過引入裝飾器來一步一步優(yōu)化代碼四康。
廢話不多說夢開始擼代碼。我們?nèi)TM存款取款的過程用代碼來表示大概如下(不大準(zhǔn)確狭握,僅僅是為了掩飾需要)
上面是按下按鈕1就存款论颅,否則則取款哎垦。
不對,存取款要輸入密碼靶崂薄:撤骸!澡谭!所以,我們要加密碼驗(yàn)證代碼损俭。
可以看到,雖然實(shí)現(xiàn)了密碼驗(yàn)證功能杆兵,但是代碼冗余度比較高雁仲,而且現(xiàn)在只模擬了取款和存款功能,然而還有查詢功能琐脏,轉(zhuǎn)賬功能等等攒砖,那么冗余度就更高了缸兔,而且相對于取款和存款函數(shù)來說,復(fù)用性沒有那么高吹艇,所以我們要進(jìn)一步優(yōu)化代碼惰蜜,把驗(yàn)證函數(shù)寫到取款和存款函數(shù)內(nèi)部。
有沒有什么方法,可以在不改變原函數(shù)以及原函數(shù)的調(diào)用的情況下擴(kuò)展原函數(shù)的功能呢鼻听?當(dāng)然是有的财著,這就是python中著名的裝飾器。還是使用上面的代碼來演示
從現(xiàn)在開始撑教,上面紅框的代碼不再進(jìn)行更改,打死也不改醉拓,我們來實(shí)現(xiàn)有密碼驗(yàn)證的存取款功能伟姐。
裝飾器裝飾有參函數(shù)
看下面這段代碼
大家看看這段代碼有沒有什么問題?
運(yùn)行結(jié)果
看報(bào)錯(cuò)原因就知道恐似,inner()函數(shù)多了一個(gè)參數(shù)。大家一定要注意一點(diǎn)傍念,因?yàn)檠b飾器函數(shù)的返回值是inner矫夷,也就是說現(xiàn)在myprint是等同于inner的。
我們來改一下代碼
為了使裝飾器能夠裝飾更多函數(shù)双藕,我們進(jìn)一步優(yōu)化代碼。
裝飾器裝飾有返回值函數(shù)
如圖可以看到,無論被裝飾的函數(shù)有無返回值近范,其結(jié)果都無返回值嘶摊,原因其實(shí)很簡單,因?yàn)閕nner()函數(shù)根本就沒有返回值评矩。為了實(shí)現(xiàn)有返回值的函數(shù)被裝飾之后仍然有返回值叶堆,需要inner函數(shù)與被裝飾函數(shù)的返回值保持一致。
可以看到虱颗,有返回值的函數(shù)被裝飾之后依然有返回值沥匈,沒有返回值的函數(shù)被裝飾之后則沒有返回值,符合我們想要的結(jié)果忘渔。
雙重語法糖
為了更加直觀地演示雙重語法糖高帖,我就不再使用上面的例子了。
我先來定義一個(gè)函數(shù)
現(xiàn)在我有一個(gè)需求棋恼,我想在'python小白聯(lián)盟'的上面打印一行'='和一行'*',也就是要實(shí)現(xiàn)這種效果锈玉。
那么應(yīng)該怎么寫呢?大家可能都會想到語法糖的疊加拉背,那疊加的方式是以下哪一種呢师崎?
我們來運(yùn)行一下就知道了
可以看到,疊加的方式應(yīng)該是***種两疚,也就是說最外層的語法糖先執(zhí)行床估。
帶參數(shù)的語法糖
為了演示帶參數(shù)的語法糖,我再把上面的一張圖搬下來
顯然丐巫,紅框部分的代碼冗余度比較高,我們可以使用帶參的語法糖來進(jìn)行簡化
裝飾器就講到這里递胧,祝大家有個(gè)愉快的一天!
注:我這有個(gè)學(xué)習(xí)Python基地赡茸,里面有很多學(xué)習(xí)資料缎脾,感興趣的+Q群:895817687