Python編程:裝飾器之有關函數的再認知
?裝飾器(Decorators)是Python中非常有用的工具。裝飾器是以另一個函數為參數并擴展其功能而不顯式修改它的函數。它允許我們修改函數或類的行為而不涉及其源代碼。
換句話說,裝飾器包裝一個函數是為了擴展它的行為,而不是永久地修改它。
從這篇開始,就來研究下裝飾器是啥以及是如何在Python中工作的。
1.1關于函數
為了理解裝飾器是如何工作的,我們需要重新回顧Python中關于函數的一些重要概念。時刻意識到,在Python中,函數(function)的地位是一等公民,所以下面幾個觀念要牢記:
- ü 函數可以賦值為常規變量;
- ü 函數可以作為參數傳遞給其他函數;
- ü 函數可以返回函數;
- ü 函數體中可以有其他函數(內部函數)。
下面來看看關于這些要點的函數示例。
1.1.1 示例-1:賦值給常規變量
在代碼中,我們將函數定義為sayHi。然后將這個函數賦值給一個名為hi的局部變量。這個變量hi也是一個函數——這種情況下,可把被賦值的變量看作是函數的別名。接著就是把變量hi當做函數調用:hi("Solo Cui")。
1.1.2 示例-2:函數作為參數傳遞
代碼清單如下:
代碼很好理解:定義了兩個函數,一個函數可以接收函數型參數,另一個函數作為參數傳遞給可接收函數型參數的函數
1.1.3 示例-3:返回函數的函數
代碼清單如下:
這里定義了一個簡單的返回另一函數的函數,即returnXFunction(),調用該函數,把其返回的值賦給一個變量xHi,然后就可以基于變量名xHi來執行返回函數的功能了。
1.1.4 示例-4:函數體內置函數
也就是在一個函數體內部定義函數。請看代碼:
我在函數outerXFunction的內部定義了一個innerXFunc函數,并在外部的函數體內部調用內嵌的函數,以便在調用外部函數時,使得內嵌函數獲得執行。
如代碼所示,調用外部函數時,把字符串“火麒麟”傳給參數msg。輸出“火麒麟 來自內嵌函數.”是由自內嵌函數完成。這里需要注意的是innerXFunc使用的msg變量在其自身函數體內并沒有定義,換句話說,它是使用的變量來自其父級范圍——這就是Python中閉包的理念。
簡單說一句,關于Python閉包:閉包是一個函數對象,它記住父級對象作用域中的值,可用來在一個函數與一組“私有”變量之間創建關聯關系。在給定函數被多次調用的過程中,這些私有變量能夠保持其持久性。?