1、普通就是一個函數作為裝飾器,也可以用類名作為裝飾器。
因為類和函數都是callable的,都可以使用括號來調用運行他。
2、上上篇的緩存一段時間的還是函數作為裝飾器,類只是充當了比模塊更下一級的命名空間,因為我的模塊很大,不想搞很多模塊級全局變量,所以用了class外殼。
正宗的類裝飾器是這樣
from functools import update_wrapper class Deco: """ Deco 的document """ def __init__(self,func): self._func = func self._func_name = func.__name__ update_wrapper(self, self._func) def __call__(self): print('啦啦啦德瑪西亞') return self._func,self._func_name,self._func() @Deco def f1(): """ f1 的document :return: """ return 'hello world' print(f1) print(f1.__doc__) print (f1())
結果是這樣
好處是相比於函數裝飾器少了閉包,缺點是函數行為變了,但函數簽名沒有完全變過來,這樣運行后函數成了裝飾器類的一個實例了。
使用類作為裝飾器來裝飾一個函數和使用函數作為裝飾器來裝飾一個類是不同的概念。
函數裝飾器來裝飾一個類,也寫過了 https://www.cnblogs.com/ydf0509/p/9211521.html