學會 python 裝飾器
裝飾器,幾乎各大python框架中都能看到它的身影,足以表明它的價值!它有動態改變函式或類功能的魔力!
本專題的目錄:
學會 python 裝飾器
1 什麼是裝飾器
2 裝飾器的結構
3 為什麼要這樣
4 裝飾乙個函式
5 裝飾乙個類
6 裝飾器層疊
7 溫馨提醒
總結1 什麼是裝飾器
對於受到封裝的原函式比如f來說,裝飾器能夠在f函式執行前或者執行後分別執行一些**。
2 裝飾器的結構
裝飾器也是乙個函式,它裝飾原函式f或類cls後,再返回乙個函式g
裝飾乙個函式:
def decorator(f):
def g():
print(『函式f執行前的動作』)
f()print(『函式f執行後的動作』)
return g
裝飾乙個類:
def decorator(cls):
def g():
print(『類cls執行前的動作』)
f()print(『類cls執行後的動作』)
return g
使用裝飾器很簡單,@+自定義裝飾器 裝飾要想裝飾的函式。
3 為什麼要這樣
要想理解裝飾器為什麼要有這種結構,要首先想明白裝飾器的目標是什麼。
它的價值在於為原函式f增加一些行為,前提必須不能破壞函式f,所以肯定不能改變f的內部結構,所以只能在呼叫f前後定義一些行為。
同時,裝飾器函式decorator返回值又是什麼?你可以思考下,返回乙個函式是再好不過的了,它包裝了原函式f.
4 裝飾乙個函式
printstar函式接收乙個函式f,返回值也是乙個函式,所以滿足裝飾器的結構要求,所以printstar是乙個裝飾器。
def printstar(f):
def g():
print(』*'20)
f()print(』'20)
return g
printstar裝飾器實現f函式執行前、後各列印20個字元。
使用printstar:
@printstar
def f():
print(『hello world』)
呼叫:ifname== 『main』:
f()列印結果:
hello world
可以很方便的裝飾要想裝飾的其他函式,如下:
@printstar
def g():
print(『welcome to python』)
5 裝飾乙個類
除了可以裝飾函式f外,還可以裝飾類cls,兩者原理都是一樣的。
下面給出乙個裝飾器實現單例模式的例子,所謂單例就是類只有唯一例項,不能有第二個。
def singleton(cls):
instance = {}
def get_instance(*args, **kwargs):
if cls not in instance:
instance[cls] = cls(*args, **kwargs)
return instance[cls]
return get_instance
定義字典instance,鍵值對分別為類和例項,這樣確保只cls()一次。
使用裝飾器singleton修飾類:
@singleton
class corepoint:
pass
測試:ifname== 『main』:
c1 = corepoint()
c2 = corepoint()
print(c1 is c2) # true
6 裝飾器層疊
上面原函式f不僅能被乙個裝飾器修飾,還能被n多個裝飾器修飾。
下面再定義乙個裝飾器printline,被修飾函式執行前後列印20個 -
def printline(f):
def g():
print(』-』*20)
f()print(』-』*20)
return g
使用上文定義好的printstar和printline同時裝飾函式f:
@printstar
@printline
def f():
print(『hello world』)
此時再呼叫函式f:
ifname== 『main』:
f()列印結果:
f被裝飾後,先列印*,再列印 -
層疊多一層,原函式f就變強大一層。使用裝飾器,還能實現功能抽離,進一步實現松耦合。
7 溫馨提醒
列印原函式f的名字__name__,結果為f
in [1]: def f():
…: pass
in [4]: f.name
out[4]: 『f』
但是,被裝飾後函式名字f變為g,這不是我們希望的!
@printstar
def f():
pass
f()f.name# g
python提供的解決方案:使用functools模組中的wraps裝飾器:
from functools import wraps
def printstar(f):
@wraps(f)
def g():
print(』*『20)
f()print(』』*20)
return g
此時再列印被裝飾後f的名字,顯示f,正常!
有相同愛好的可以進來一起討論哦:企鵝群號:1046795523
Python三大神器之 裝飾器
def info print 這是學生資訊 info a info print id a print id info a 展示 4009632 4009632 這是學生資訊def info return 小王 defsuccess print 返回值函式 def printinfo func par...
python三大神器 裝飾器
裝飾器 decorator 能增強now 函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now 函式的定義,這種在 執行期間動態增加功能的方式,稱之為。本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印購物的decorator,可以定義如下 def inn...
python三大神器裝飾器 Python 裝飾器
裝飾器 本質是函式,用於裝飾其他函式,為其他函式新增附加功能 原則 1.不能比修改被裝飾的函式的 2.不能修改被裝飾的函式的呼叫方式 import time def timmer func def warpper args,kwargs start time time.time func stop ...