裝飾器(Decorators)是Python中非常有用的工具。裝飾器是以另一個函數為參數並擴展其功能而不明確修改它的函數。它允許我們修改函數或類別的行為而不涉及其原始程式碼。
換句話說,裝飾器包裝一個函數是為了擴展它的行為,而不是永久地修改它。
從這篇開始,就來研究下裝飾器是啥以及是如何在Python中運作的。
為了理解裝飾器是如何運作的,我們需要重新回顧Python中關於函數的一些重要概念。時時刻刻意識到,在Python中,函數(function)的地位是一等公民,所以下面幾個觀念要牢記:
下面來看看關於這些要點的函數範例。
1.1.1 範例-1:賦值給常規變數
# 把函数赋值给常规变量: # 定义简单函数 def sayHi(name:str): return "Hi " + name + "." #应用:函数赋值给变量 hi = sayHi print(hi("Solo Cui")) #输出结果 Hi Solo Cui.
在程式碼中,我們將函數定義為sayHi。然後將這個函數賦值給一個名為hi的局部變數。這個變數hi也是一個函數──在這種情況下,可把被賦值的變數看成是函數的別名。接著就是把變數hi當作函式呼叫:hi("Solo Cui")。
1.1.2 範例-2:函數作為參數傳遞
#程式碼清單如下:
# 函数作为参数传递 def printHello(name): print("Hello,", name) # 把函数作为参数的函数 def hiWithFunction(func, xname): func(xname) #调用以函数为参数的函数 hiWithFunction(printHello,'上官婉儿')
程式碼很好理解:定義了兩個函數,一個函數可以接收函數型參數,另一個函數作為參數傳遞給可接收函數型參數的函數
1.1.3 範例-3:傳回函數的函數
程式碼清單如下:
#示例3:返回函数的函数 def returnXFunction(): return sayHi #示例1中定义的函数,可自行定义其它函数 # 调用函数 xHi = returnXFunction() print(xHi("BirdMan"))
這裡定義了一個簡單的返回另一個函數的函數,即returnXFunction(),呼叫該函數,把其傳回的值賦給一個變數xHi,然後就可以基於變數名xHi來執行回傳函數的功能了。
1.1.4 範例-4:函數體內建函數
也就是在一個函數體內部定義函數。請看程式碼:
# 示例4:函数体内不含税 def outerXFunction(msg): '''外部函数''' #代码... #定义内嵌函数 def innerXFunc(): '''内部函数''' print(msg,'来自内嵌函数.') #函数体内调用内嵌函数 innerXFunc() #调用外部函数 outerXFunction("火麒麟")
我在函數outerXFunction的內部定義了一個innerXFunc函數,並在外部的函數體內部呼叫內嵌的函數,以便在呼叫外部函數時,使得內嵌函數獲得執行。
如程式碼所示,呼叫外部函數時,把字串「火麒麟」傳給參數msg。輸出「火麒麟 來自內嵌函數。」是由自內嵌函數完成。這裡要注意的是innerXFunc使用的msg變數在其自身函數體內並沒有定義,換句話說,它是使用的變數來自其父級範圍-這就是Python中閉包的理念。
簡單說一句,關於Python閉包:閉包是一個函數對象,它記住父級對像作用域中的值,可用來在一個函數與一組「私有」變數之間建立關聯關係。在給定函數被多次呼叫的過程中,這些私有變數能夠保持其持久性。
以上是Python程式設計:裝飾器之有關函數的再認知的詳細內容。更多資訊請關注PHP中文網其他相關文章!