當需求相似的函數需要使用裝飾器時,這種差別不大的函數,如果定義多個相似的裝飾器來各自裝飾特定函數就太過贅餘了。 【比如說A需要記錄日誌功能的裝飾器,B需要記錄日誌+發送給指定管理員功能的裝飾器,它們之間有重合的功能--記錄日誌】【如果相同代碼量很大,那麼新弄的代碼重覆量就更大了】 為瞭解決這種問題,... ...
當需求相似的函數需要使用裝飾器時,這種差別不大的函數,如果定義多個相似的裝飾器來各自裝飾特定函數就太過贅餘了。
【比如說A需要記錄日誌功能的裝飾器,B需要記錄日誌+發送給指定管理員功能的裝飾器,它們之間有重合的功能--記錄日誌】【如果相同代碼量很大,那麼新弄的代碼重覆量就更大了】
為瞭解決這種問題,我們可以使用裝飾器的類型來解決,與之前的區別隻是再加上一層嵌套而已:
def decorator(my_type): def outwrapper(func): def wrapper(*args,**kwargs): print("logged done")#假功能 if my_type=='A': res = func() return res else : print("send done")#假功能 res = func() return res return wrapper return outwrapper @decorator('A') def testA(): print("run in A") return @decorator('B') def testB(): print("run in B") return testA() print("-------------") testB()
相當於,當裝飾器給定參數時,【裝飾器原本預設有一個函數對象參數】,相當於會選擇第二次再傳入預設的函數對象參數
原本是:
test3=outwrapper(func) => test3=wrapper()
現在是:
test3=decorator(A) => outwrapper(func) => test3=wrapper()