我終於弄懂了Python的裝飾器(一)
阿新 • • 發佈:2020-07-07
**此係列文件:**
[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)
#