您好,登錄后才能下訂單哦!
關于Python中裝飾器的詳細簡介及功能用法?這個問題可能是我們日常學習或工作經常見到的。希望通過這個問題能讓你收獲頗深。下面是小編給大家帶來的參考內容,讓我們一起來看看吧!
python裝飾器
剛剛接觸python的裝飾器,簡直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍資料,才有點點開始明白了。
待會我將會和大家一起通過代碼的形式來迷你銀行存款取款的功能,然后通過引入裝飾器來一步一步優化代碼。
廢話不多說夢開始擼代碼。我們去ATM存款取款的過程用代碼來表示大概如下(不大準確,僅僅是為了掩飾需要)
上面是按下按鈕1就存款,否則則取款。
不對,存取款要輸入密碼啊!!!所以,我們要加密碼驗證代碼。
可以看到,雖然實現了密碼驗證功能,但是代碼冗余度比較高,而且現在只模擬了取款和存款功能,然而還有查詢功能,轉賬功能等等,那么冗余度就更高了,而且相對于取款和存款函數來說,復用性沒有那么高,所以我們要進一步優化代碼,把驗證函數寫到取款和存款函數內部。
有沒有什么方法,可以在不改變原函數以及原函數的調用的情況下擴展原函數的功能呢?當然是有的,這就是python中著名的裝飾器。還是使用上面的代碼來演示
從現在開始,上面紅框的代碼不再進行更改,打死也不改,我們來實現有密碼驗證的存取款功能。
裝飾器裝飾有參函數
看下面這段代碼
大家看看這段代碼有沒有什么問題?
運行結果
看報錯原因就知道,inner()函數多了一個參數。大家一定要注意一點,因為裝飾器函數的返回值是inner,也就是說現在myprint是等同于inner的。
我們來改一下代碼
為了使裝飾器能夠裝飾更多函數,我們進一步優化代碼。
裝飾器裝飾有返回值函數
如圖可以看到,無論被裝飾的函數有無返回值,其結果都無返回值,原因其實很簡單,因為inner()函數根本就沒有返回值。為了實現有返回值的函數被裝飾之后仍然有返回值,需要inner函數與被裝飾函數的返回值保持一致。
可以看到,有返回值的函數被裝飾之后依然有返回值,沒有返回值的函數被裝飾之后則沒有返回值,符合我們想要的結果。
雙重語法糖
為了更加直觀地演示雙重語法糖,我就不再使用上面的例子了。
我先來定義一個函數
現在我有一個需求,我想在'python小白聯盟'的上面打印一行'='和一行'*',也就是要實現這種效果。
那么應該怎么寫呢?大家可能都會想到語法糖的疊加,那疊加的方式是以下哪一種呢?
我們來運行一下就知道了
可以看到,疊加的方式應該是***種,也就是說最外層的語法糖先執行。
帶參數的語法糖
為了演示帶參數的語法糖,我再把上面的一張圖搬下來
顯然,紅框部分的代碼冗余度比較高,我們可以使用帶參的語法糖來進行簡化。
感謝各位的閱讀!看完上述內容,你們對關于Python中裝飾器的詳細簡介及功能用法大概了解了嗎?希望文章內容對大家有所幫助。如果想了解更多相關文章內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。