Python 語法之裝飾器
裝飾器的概念
裝飾器是 Python 的一個重要部分。簡單地說:就是用於擴充原來函式功能的一種函式,目的是在不改變原函式名(或類名)的情況下,給函式增加新的功能。
這個函式的特殊之處在於它的返回值也是一個函式,這個函式是內嵌 “原” 函式的函式。
將函式作為引數傳給另一個函式
def yanzheng():
return "--- 正在驗證 ---"
def login(func):
print(func())
print("--- 正在登陸 ---")
login(yanzheng)
執行結果:
--- 正在驗證 ---
--- 正在登陸 ---
寫程式碼要遵循開放封閉原則,雖然在這個原則是用的物件導向開發,但是也適用於函數語言程式設計,簡單來說,它規定已經實現的功能程式碼不允許被修改,但可以被擴充套件,即:
封閉:已實現的功能程式碼塊
開放:對擴充套件開發
現在你已經具備所有必需知識,接下來進一步學習什麼是真正的裝飾器。
你的第一個裝飾器
def func_out(func):
def func_in():
print("--- 正在驗證 ---")
func()
return func_in
@func_out
def login():
print("--- 正在登陸 ---")
login()
執行結果:
--- 正在驗證 ---
--- 正在登陸 ---
@函式名稱 是 Python 的一種語法糖。簡而言之,語法糖就是程式語言中提供[奇技淫巧]的一種手段和方式而已。 透過這類方式編寫出來的程式碼,即好看又好用,好似糖一般的語法。固美其名曰:語法糖
裝飾器下面正好是個函式,則預設執行:login = func_out(login)
裝飾器的流程圖
裝飾有返回值的函式
上面的案例,被裝飾的 login() 函式並沒有返回值,那麼接下來我們們看看有返回值的函式如何裝飾。
首先,先看第一個案例:
def func_out(func):
def func_in():
print("--- 正在驗證 ---")
func()
return func_in
@func_out
def login():
return "--- 正在登陸 ---"
result = login()
print(result)
執行結果:
--- 正在驗證 ---
None
思考一下,為什麼我呼叫 login() 函式,並且使用 result 變數來接收返回值,為什麼結果是 None 呢?
如果想不明白,就看看第二個案例:
def func_out(func):
def func_in():
print("--- 正在驗證 ---")
data = func()
return data
return func_in
@func_out
def login():
return "--- 正在登陸 ---"
result = login()
print(result)
執行結果:
--- 正在驗證 ---
--- 正在登陸 ---
大家仔細觀察程式碼,這兩個案例有哪些不同?
發現了嗎?我在 func_in() 函式的裡面多寫了兩句程式碼:
1、當我們呼叫被裝飾的 login() 函式時,實際執行的是 func_in() 函式的程式碼,此時會呼叫 print() 函式列印 "--- 正在驗證 ---"。 鄭州人流醫院
2、程式碼執行到 data = func() 時,會先執行右側的 func() 函式,而這個函式是原始的 login() 函式,所以會 return 返回一個值,此時這個值被等號左側的 data 變數接收。
3、程式碼執行到 return data,此時會將 data 值返回更上一層,而這個值被 result 變數接收。
4、最終列印 result 變數就輸出了原始 login() 函式的值。
在這裡最需要注意的就是 return 返回資料,只能返回一層函式,多層時,就需要在上層同時使用 return。
裝飾有引數的函式
demo1:
def func_out(func):
def func_in():
func()
return func_in
def login(a):
prin
print(a)
login(10)
執行結果:
10
demo2:
def func_out(func):
def func_in():
func()
return func_in
@func_out
def login(a):
print(a)
login(10)
執行結果:
TypeError: func_in() takes 0 positional arguments but 1 was given
型別錯誤:func_in()接受0個位置引數,但給出了1個
demo3:
def func_out(func):
def func_in(data):
func(data)
return func_in
@func_out
def login(a):
print(a)
login(10)
執行結果:
10
demo4:
def func_out(func):
def func_in(*args,**kwargs):
func(*args,**kwargs)
return func_in
@func_out
def login(*args,**kwargs):
print(args)
print(kwargs)
login(10,20,c=1,b=2)
執行結果:
(10, 20)
{'c': 1, 'b': 2}
總結
裝飾器函式只有一個引數就是被裝飾的函式的引用
裝飾器能夠將一個函式的功能在不修改程式碼的情況下進行擴充套件
在函式定義的上方@裝飾器函式名 即可直接使用裝飾器對下面的函式進行裝飾
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2669428/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python中裝飾器語法詳解Python
- python 之裝飾器(decorator)Python
- Python之函式裝飾器Python函式
- Python深入分享之裝飾器Python
- 裝飾器、語法糖、修復技術
- python裝飾器2:類裝飾器Python
- Python裝飾器之property()詳解Python
- Python裝飾器探究——裝飾器引數Python
- 學習 ES7 語法 decorator 裝飾器
- vscode使用ES6裝飾器器語法VSCode
- Python 裝飾器Python
- Python裝飾器Python
- 裝飾器 pythonPython
- Python 裝飾器之 functools.wrapsPython
- python基礎 之 裝飾器詳解Python
- Python之裝飾器、迭代器和生成器Python
- Python 裝飾器裝飾類中的方法Python
- Python裝飾器模式Python模式
- python的裝飾器Python
- 1.5.3 Python裝飾器Python
- Python 裝飾器(一)Python
- Python 裝飾器原理Python
- Python黑魔法之property裝飾器詳解Python
- Python進階之閉包和裝飾器Python
- 在 create-react-app 中啟用裝飾器語法ReactAPP
- python基礎(補充):python三大器之裝飾器Python
- 草根學Python(十六) 裝飾器(逐步演化成裝飾器)Python
- Python 中級學習之函式裝飾器Python函式
- Python深入05 裝飾器Python
- Python裝飾器詳解Python
- Python中的裝飾器Python
- 【Python】淺談裝飾器Python
- 初識Python裝飾器Python
- Python 裝飾器的理解Python
- python裝飾器介紹Python
- 淺談Python裝飾器Python
- Python3 裝飾器解析Python
- Python裝飾器高階用法Python