搞定三大神器之 Python 裝飾器

2021-10-09 17:32:23 字數 2922 閱讀 8785

學會 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 ...