之前的文章已經介紹了裝飾器,它本質也是一個方法,隻不過它的入參也是一個方法,返回的也是一個方法,目的就是能夠對傳入的方法做前置或後置的處理。見下圖,func被decorator裝飾後實際上已經變成了另外一個方法。
下面是一個簡單的示例,本身沒有什麼意義,隻是為了聚焦帶參數的裝飾器本身,唯一不太好理解的就是logged方法中又嵌套定義了兩個方法decorate、wrapper,python中一切都是對象,既然方法内部可以定義數組、數字、字符串等,那麼定義方法也沒有什麼不可以的,因為它們都是python對象,暫時不理解也不要過于糾結,承認這樣做是可以的就是了。
from functools import wraps
def logged(message="帶參數的裝飾器"):
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(message)
return func(*args, **kwargs)
return wrapper
return decorate
# 使用默認參數
@logged()
def add(x, y):
return x y
@logged("這是一個裝飾器傳入的參數")
def spam():
print('Spam!')
add(3,4)
spam()
實際執行結果如下,我們看到被logged裝飾後的方法add、spam執行後分别打印了logged默認的message值和指定的message值,實現了裝飾器攜帶參數。
如果我們隻關注logged内部的decorate方法就會發現,它和之前介紹的無參數的裝飾器非常相似,而使用裝飾器的方法如@logged()實際上就是對logged方法進行了調用,返回的就是decorate方法。參見下圖,logged(mesaage)調用的返回結果就相當于開頭的decorator方法,它接受func作為參數。
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!