Python程式設計:裝飾器之有關函數的再認知

王林
發布: 2023-05-27 15:57:22
轉載
1115 人瀏覽過

裝飾器(Decorators)是Python中非常有用的工具。裝飾器是以另一個函數為參數並擴展其功能而不明確修改它的函數。它允許我們修改函數或類別的行為而不涉及其原始程式碼。

換句話說,裝飾器包裝一個函數是為了擴展它的行為,而不是永久地修改它。

從這篇開始,就來研究下裝飾器是啥以及是如何在Python中運作的。

Python程式設計:裝飾器之有關函數的再認知

1.1關於函數

為了理解裝飾器是如何運作的,我們需要重新回顧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中文網其他相關文章!

相關標籤:
來源:51cto.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板