當前位置:
首頁 > 最新 > Python裝飾器用法雖然簡單,其原理卻難住了一幫老程序員

Python裝飾器用法雖然簡單,其原理卻難住了一幫老程序員

學過Python的人都知道它有一個非常好用的語法——裝飾器,當你想計算某個函數的執行時間時,就可以先定義這麼個結構

然後在函數定義前@一下上面那個結構

之後函數執行時,就連帶著執行了我們之前定義的結構。裝飾器語法雖然簡單,但我在工作中面試了不少Python程序員,至今還沒遇到過一個能說出裝飾器原理的人,他們中不乏三年以上工作經驗的人,實在是令人匪夷所思!今天我們就一起來過一下裝飾器的原理,希望能對讀者有所幫助!

介紹裝飾器原理前我們先來複習一下高階函數的概念。在Java這種號稱面向對象的編程語言中,函數(方法)能夠接受基本數據類型作為參數或傳入對象的引用,然而方法本身卻無法做參數,因為它們既不是基本數據類型,也不是對象,而Python中,一切皆對象,函數自然也是一種對象,因而可以作為對象傳入另一個函數,也可以被別的函數返回。這種以函數為參數或返回函數的函數就稱為高階函數。

然後我們回到之前定義的裝飾器,可以發現外層函數接受了一個函數參數,並將內層函數作為結果返回了,因而外層函數是一個名副其實的高階函數。那麼這個高階函數在實際執行中到底是怎樣發揮作用的呢?

當我們在定義被裝飾的函數 f 時,將@timeit放在了函數體之前,其實等效的結果是執行了timeit(f)(s)這樣一個結構,首先將f作為參數傳入timeit函數,timeit函數里定義了另一個函數wrapper,timeit執行的結果是將這個定義的函數返回,返回後,wrapper繼而接收s作為參數執行,於是得到了我們最終看到的結果。

同樣的,讀者可以自己分析一下下面這個裝飾器的原理,以加深對裝飾器的認識。(裝飾器只是一個語法糖,沒什麼高深的)


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

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


請您繼續閱讀更多來自 Python 的精彩文章:

Python讀書筆記18

TAG:Python |