裝飾器的功能在很多語言中都有,名字也不盡相同,其實它體現的是一種設計模式,強調的是開放封閉原則,更多的用于后期功能升級而不是編寫新的代碼。裝飾器不光能裝飾函數,也能裝飾其他的對象,比如類,但通常,我們以裝飾函數為例子介紹其用法。要理解在Python中裝飾器的原理,需要一步一步來。本文盡量描述得淺顯易懂,從最基礎的內容講起。
(注:以下使用Python3.5.1環境)
一、Python的函數相關基礎
第一,必須強調的是python是從上往下順序執行的,而且碰到函數的定義代碼塊是不會立即執行它的,只有等到該函數被調用時,才會執行其內部的代碼塊。
def foo():print("foo函數被運行了!") 如果就這么樣,foo里的語句是不會被執行的。程序只是簡單的將定義代碼塊讀入內存中。
再看看,順序執行的例子:
def foo(): print("我是上面的函數定義!")def foo(): print("我是下面的函數定義!")foo()運行結果:我是下面的函數定義
可見,因為順序執行的原因,下面的foo將上面的foo覆蓋了。因此,在Python中代碼的放置位置是有要求的,不能隨意擺放,函數體要放在被調用的語句之前。
其次,我們還要先搞清楚幾樣東西:函數名、函數體、返回值,函數的內存地址、函數名加括號、函數名被當作參數、函數名加括號被當作參數、返回函數名、返回函數名加括號。對于如下的函數:
def foo(): print("讓我們干點啥!") return "ok" foo()
函數名: foo
函數體: 第1-3行
返回值: 字符串“ok” 如果不顯式給出return的對象,那么默認返回None
函數的內存地址: 當函數體被讀進內存后的保存位置,它由標識符即函數名foo引用,
也就是說foo指向的是函數體在內存內的保存位置。
函數名加括號: 例如foo(),函數的調用方法,只有見到這個括號,程序會根據
函數名從內存中找到函數體,然后執行它
新聞熱點
疑難解答