裝飾器如何裝飾乙個函式

2021-10-18 19:11:03 字數 1200 閱讀 7946

裝飾器如何裝飾乙個函式?今天番茄加速就來講一下。

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』)

裝飾乙個類

除了可以裝飾函式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

乙個裝飾器裝飾乙個函式

2 如果鍵不存在,則新增到字典中。請使用裝飾器來實現,順便複習下 args和 kwargs的用法 a defselect func def inner args,kwargs if len args 0 if kwargs key in kwargs data print 鍵存在 else func...

帶函式的裝飾器 多個裝飾器裝飾乙個函式

一 帶引數的裝飾器 開關 author administrator f true defouter f def wap fun ggdef inner args,kwargs iff print inner before ret fun args,kwargs gg print inner afte...

小技巧 裝飾器裝飾乙個遞迴函式

在python中裝飾器可以為原函式新增一些功能。但如果函式本身是遞迴定義的,則不會僅裝飾最外層,而是在每次遞迴的時候都呼叫裝飾器。這樣會導致原函式無法被直觀的裝飾。首先定義乙個裝飾器 隨便定義乙個裝飾器 defmy decorator fun def decorator args,kwargs fu...