1. 程式人生 > >我終於弄懂了Python的裝飾器(一)

我終於弄懂了Python的裝飾器(一)

**此係列文件:** [1. 我終於弄懂了Python的裝飾器(一)](https://www.bigyoung.cn/posts/91/) [2. 我終於弄懂了Python的裝飾器(二)](https://www.bigyoung.cn/posts/92/) [3. 我終於弄懂了Python的裝飾器(三)](https://www.bigyoung.cn/posts/93/) [4. 我終於弄懂了Python的裝飾器(四)](https://www.bigyoung.cn/posts/94/) ## 一、裝飾器基礎(什麼是裝飾器) ### Python的函式是物件 要了解裝飾器,您必須首先了解函式是Python中的物件。這具有重要的聯絡。 讓我們來看一個簡單的例子: ```python def shout(word="yes"): return word.capitalize()+"!" print(shout()) # 輸出 : 'Yes!' # 作為一個物件,您可以像其他物件一樣將函式賦給變數 scream = shout #注意我們不使用括號:我們沒有呼叫函式 #我們將函式“shout”放入變數“scream”。 #這意味著您可以從“scream”中呼叫“shout”: print(scream()) # 輸出: 'Yes!' #除此之外,這意味著您可以刪除舊名稱'shout',該功能仍可從'scream'訪問 del shout try: print(shout()) except NameError as e: print(e) #輸出: "name 'shout' is not defined" print(scream()) # 輸出: 'Yes!' ``` 請記住這一點,我們將在不久後回頭再說。 Python函式的另一個有趣特性是可以在另一個函式中定義它們! ```python def talk(): # 您可以在“talk”中動態定義一個函式... def whisper(word="yes"): return word.lower()+"..." # ...並且可以立馬使用它。 print(whisper()) #您每次呼叫“talk”,都會定義“whisper”,然後在“talk”中呼叫“whisper”。 talk() # 輸出: # "yes..." # 但是"whisper"不存在"talk"定義以外的地方: try: print(whisper()) except NameError as e: print(e) #輸出 : "name 'whisper' is not defined" ``` ### 函式參考 OK,應該還在看吧?現在開始有趣的部分... 您已經看到函式是物件。 因此,函式: * 可以分配給變數 * 可以在另一個函式中定義 這意味著**一個函式可以`return`另一個功能**。 ```python def getTalk(kind="shout"): # 我們頂一個即時的函式 def shout(word="yes"): return word.capitalize()+"!" def whisper(word="yes") : return word.lower()+"..."; # 然後我們返回它 if kind == "shout": #我們不使用“()”,所以我們沒有呼叫函式,我們正在返回這個函式物件 return shout else: return whisper #獲取函式並將其分配給變數: "talk" talk = getTalk() #您可以看到“talk”是一個函式物件: print(talk) #