當前位置:
首頁 > 知識 > 一篇關於Python裝飾器的博文

一篇關於Python裝飾器的博文

在學習python的過程中處處受阻,之前的學習中Python的裝飾器學習了好幾遍也沒能真正的弄懂。這一次抓住視頻猛啃了一波,就連python大佬講解裝飾器起來也需要大半天的時間。據說是兩個老師輪流講解,還得吃藥才能講完。

聽完兩位老師的講解,我算是系統而又全面的理解了裝飾器,並將其總結。

一、定義

想要徹底的弄清楚裝飾器,就得徹底的弄明白Python裝飾器的定義,百科裡的定義說:裝飾器是一個很著名的設計模式,經常被用於有切面需求的場景,較為經典的有插入日誌、性能測試、事務處理等。裝飾器是解決這類問題的絕佳設計,有了裝飾器,我們就可以抽離出大量函數中與函數功能本身無關的雷同代碼並繼續重用。之前的都是扯淡,具體的等深入後才能了解,我們目前只需要明白裝飾器的作用就是為已經存在的對象添加額外的功能。

簡單來說,裝飾器的作用就是給已經存在的函數附加功能。

二、原則

做任何事都需要講究原則。編寫裝飾器也需要按照相應的原則出現,如果不遵守其原則就不能算是裝飾器。

裝飾器的原則:

A、不能修改被裝飾函數的源代碼

B、不能修改裝飾器的函數的調用方式

一篇關於Python裝飾器的博文

圖2.1需求

一篇關於Python裝飾器的博文

圖2.2修改一

如圖2.2中的foo函數。雖然實現了圖2.1中所需求的功能,但是圖2.2中的foo修改了代碼,這便違反了裝飾器原則一,不能稱之為裝飾器。

一篇關於Python裝飾器的博文

圖2.3修改二

如圖2.3中的test函數。它也實現了圖2.1中所需求的功能,但是圖2.3中需要調用test函數才能實現其功能,這樣就違反了原則二(如果程序中有一千個foo函數就得將這1000個foo全改成test),這麼修改也不能稱之為裝飾器。

三、掌握裝飾器所需的知識儲備

想要掌握python的裝飾器,就得先掌握如下知識作為掌握裝飾器成儲備知識:

1、函數即「變數」(一切皆對象)

2、高階函數

3、嵌套函數

只有掌握了這三個知識,才能掌握裝飾器。

3.1 函數即「變數」(一切皆對象)

在python中,一切皆對象(這就是為什麼這麼多屌絲來學python的原因)。變數是對象,函數是對象,類是對象,所有的一切都是對象。如圖3.1所示,這裡定義函數func,於是內存中就開闢屬於func的內存空間,寫入func的函數功能。隨後在解釋器上輸入func函數的函數名,這時會返回一串指針地址,在python中所有的對象都會對應的指針地址,即指向內存中func函數的位置。如果在func函數名後加上,這就說明func根據指針地址調用了func函數。

如圖,將func函數的變數名賦值給f,就是將func的內存地址賦值給f,f就會指向內存紅func函數的位置。在解釋器中輸入f時,就能調用對應地址的func函數。

一篇關於Python裝飾器的博文

圖3.1一切皆對象

3.2高階函數

高階函數即一個函數的函數名作為參數傳入另一個函數。如圖3.2所示。定義func函數有x,y,f三個參數,執行func函數時將實參abs(abs是求絕對值的內置函數)傳形參f,func函數最後return兩數的絕對值和。

圖3.2高階函數

3.3嵌套函數

嵌套函數是在一個函數的函數體內聲明一個函數,再調用

一篇關於Python裝飾器的博文

圖3.3嵌套函數

四、裝飾器初成

如圖4.1所示,這樣寫就能夠實現圖2.1中的需求,並且遵循了裝飾器的兩個原則。其中就涉及到了裝飾器的三個儲備知識,由此可見三個儲備知識的重要性。

一篇關於Python裝飾器的博文

圖4.1裝飾器初成

但是圖4.1中的test只是剛好裝飾沒有返回值的函數,如圖4.2則可以裝飾存在返回值的函數。

一篇關於Python裝飾器的博文

圖4.2裝飾器初成修改

五、裝飾器小成

四中描述的裝飾器還不夠全面,如果函數foo需要傳入參數時,圖4.2中的裝飾函數就會報錯。於是這裡就涉及到了函數的可變長參數和可變長關鍵字參數。這樣就能實現任意的參數傳入。於是裝飾器的功法就小有所成了。如圖5.1所示。

一篇關於Python裝飾器的博文

圖5.1裝飾器小成

六、裝飾器大成

其實裝飾器學到五的時候,我就覺得已經很厲害了,想著自己終於弄懂了,但是視頻里的老師又繼續補充了一個關於裝飾函數傳參的知識點,突然間我就覺得這節課值500塊。老師最後的代碼是這樣的。這是一個模擬網站不同登陸方式的裝飾器,使用一個裝飾器,對不同的函數的附加不同的功能。Home函數使用密碼登陸方式,bbs函數使用另一種登入方式(此處只是模擬一下),如圖6.1所示。

一篇關於Python裝飾器的博文

圖6.1裝飾器大成

七、總結

以上就是我學習裝飾器之後對其的總結,根據上述內容,我繪製了一個概念圖,便於對裝飾器的理解和掌握。

一篇關於Python裝飾器的博文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

「Git」1、常用Git命令行總結(一)
jQchart 介紹
用 Node.js 把玩一番 Alfred Workflow
Docker Swarm——集群管理
HashMap遍歷和使用

TAG:科技優家 |

您可能感興趣

一場關於Disney的夢
關於Sprüth Magers畫廊
關於Westone Audio的那些事:老物篇
關於TIA Portal軟體安裝
「關於Whalesong。」
關於Hubert de Givenchy先生的10個關鍵詞
關於Hubert de Givenchy先生的10個關鍵詞。
Kids club 關於音樂
關於Peter Quinn
為什麼 Kata 容器不會取代kubernets:關於 Kata 容器的自述
關於RoboMaster
關於Miss Xie
關於一次Oracle資料庫DMP文件導入的記述
Girl』s Talk——關於HPV的二三事
關於柏林電影節,你必須知道的七件事 Was Sieüber die Berlinale wissen müssen
老P關於料理的一些想法,About Cook From Peter
關於情緒 About emotions
關於DLX Creative
Chinatown Market x PLEASURES 這次的合作關於動漫,龍珠和春麗
關於 Panyu E-Commerce