天天看點

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

今天的任務比較繁重,因為我們要一起來學習Python中比較重要比較牛逼比較難的裝飾器。

我将會和大家一起通過代碼的形式來迷你銀行存款取款的功能,然後通過引入裝飾器來一步一步優化代碼。

廢話不多說夢開始撸代碼。我們去ATM存款取款的過程用代碼來表示大概如下(不大準确,僅僅是為了掩飾需要)

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...
python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

上面是按下按鈕1就存款,否則則取款。

不對,存取款要輸入密碼啊!!!是以,我們要加密碼驗證代碼。

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

可以看到,雖然實作了密碼驗證功能,但是代碼備援度比較高,而且現在隻模拟了取款和存款功能,然而還有查詢功能,轉賬功能等等,那麼備援度就更高了,而且相對于取款和存款函數來說,複用性沒有那麼高,是以我們要進一步優化代碼,把驗證函數寫到取款和存款函數内部。

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...
python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

有沒有什麼方法,可以在不改變原函數以及原函數的調用的情況下擴充原函數的功能呢?當然是有的,這就是python中著名的裝飾器。還是使用上面的代碼來示範

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

從現在開始,上面紅框的代碼不再進行更改,打死也不改,我們來實作有密碼驗證的存取款功能。

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...
python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

裝飾器裝飾有參函數

看下面這段代碼

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

大家看看這段代碼有沒有什麼問題?

運作結果

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

看報錯原因就知道,inner()函數多了一個參數。大家一定要注意一點,因為裝飾器函數的傳回值是inner,也就是說現在myprint是等同于inner的。

我們來改一下代碼

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

為了使裝飾器能夠裝飾更多函數,我們進一步優化代碼。

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

裝飾器裝飾有傳回值函數

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

如圖可以看到,無論被裝飾的函數有無傳回值,其結果都無傳回值,原因其實很簡單,因為inner()函數根本就沒有傳回值。為了實作有傳回值的函數被裝飾之後仍然有傳回值,需要inner函數與被裝飾函數的傳回值保持一緻。

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

可以看到,有傳回值的函數被裝飾之後依然有傳回值,沒有傳回值的函數被裝飾之後則沒有傳回值,符合我們想要的結果。

雙重文法糖

為了更加直覺地示範雙重文法糖,我就不再使用上面的例子了。

我先來定義一個函數

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

現在我有一個需求,我想在'python小白聯盟'的上面列印一行'='和一行'*',也就是要實作這種效果。

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

那麼應該怎麼寫呢?大家可能都會想到文法糖的疊加,那疊加的方式是以下哪一種呢?

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...
python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

我們來運作一下就知道了

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

可以看到,疊加的方式應該是***種,也就是說最外層的文法糖先執行。

帶參數的文法糖

為了示範帶參數的文法糖,我再把上面的一張圖搬下來

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...

顯然,紅框部分的代碼備援度比較高,我們可以使用帶參的文法糖來進行簡化

python裝飾器作用和功能_這是我見過最全面的Python裝飾器詳解!沒有學不會這種說法!...