裝飾器之適配裝飾器

2021-08-08 12:09:13 字數 1324 閱讀 8851

可能沒人發現,前面描述的裝飾器受眾面太小了

都是只能知道原函式入參個數的情況下才能編寫裝飾器,所以寫出來的裝飾器都只能針對入參個數的函式使用(不侷限於原函式)

def godme(fun):

def __godme(message):

print('before')

fun(message)

print('after')

return __godme

@godme

def show(message):

print(message)

執行結果
before

after

如果相同的操作想要覆蓋更多入參或者更少入參的函式時,就又得重新編寫乙個裝飾器

麻煩的要死,全是勞力,全是重複**,這不是累的死去活來還給老闆扣工資的理由麼

不過我們現在會變參了,讓猩猩們點燈,為我們照亮前行的道路

def godme(fun):

def __godme(*args,**kwargs):

print('before')

fun(*args,**kwargs)

print('after')

return __godme

@godme

def one(a,b):

print(a+b)

@godme

def two(message):

print(message)

one(3,5)

列印結果

before

8after

before

after

啊哈哈哈,倚天屠龍,號令天下,誰敢不從,啊哈哈哈

恩哼,太失態了啊師太

不過這裡面我突然發現隱藏著乙個大坑,巨坑,那就是

這個裝飾器裡面有收容所,的確可以準確的實現變參,裝飾不同入參的方法

不過從原方法執行前的操作中,是檢測不出入參正確與否的,原方法裡面不一定有收容所

但是裝飾器為了應對各種的入參方法,收容所是必備的,誰知道會不會有臥底

如果在原方法執行前進行了太多的修飾操作,但是引數的傳入數量是不匹配或者型別是錯誤的,這就會浪費太多的時間執行乙個必定錯誤的操作

但是原方法執行前的確不能夠進行檢測,哪怕只是針對幾種入參數量

即使是數量正確,型別錯誤也沒辦法,都會花費時間和資源去等待乙個錯誤,而且沒有規避的辦法

不能夠主動規避錯誤的發生,浪費時間和資源去等待結果,祈禱不出錯,這或許就是裝飾器最大的短板

唯一的辦法就是保證外部函式呼叫的正確性,才能發揮裝飾器最大功效

否則修飾越多,結局越慘

裝飾器之類裝飾器

外部的方法至今都玩過了,現在來思索一下的方法這麼裝飾 類方法修飾器 類的方法唯一的特殊點在於,self內部是可以呼叫的,但是在外部卻是隱藏的,那這個怎麼搞 為求穩妥,先定參修飾乙個 def godme fun def godme self,message print before fun self,...

python裝飾器 裝飾器

由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...

python裝飾器 函式裝飾器,類裝飾器

只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...