裝飾器如何裝飾乙個函式?今天番茄加速就來講一下。
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...