學習python的裝飾器時,在裝飾器的引數這裡卡住了,後來總算是搞清楚了怎麼回事。
為了方便起見,這裡只討論由函式定義的函式裝飾器。
普通的無引數裝飾器很好理解:
def dec1(f):
f(*args)
@dec1
def spam(a, b, c):
print(a + b + c)
# 實際的效果是:
# spam = dec1(spam)
裝飾器的語法就是簡化了像注釋中那樣的賦值,即將spam函式物件作為引數傳入dec函式,然後將返回值重新賦值給spam變數。
下面來看帶引數的情況:
# 為了方便對照,這裡引數的變數名是類似的,其實沒有必要
# 後面會給出乙個變數名更好看的例子
def dec2(f):
return *args
@dec2('anything')
def spam(a, b, c):
print(a + b + c)
這個例子看起來跟上個例子差不多,只不過在@裝飾器的時候多加了乙個引數,但其實是有很大不同的。
如果繼續套用裝飾器自動重繫結的定義,就會發現問題:
由於已經有了乙個引數,spam該怎麼傳給dec函式?
難道是spam = dec('anything', spam)?
根據dec的定義,它只能接受乙個引數,這樣顯然是不對的。
從另乙個角度看,我們可以認為@裝飾器語法最終是不能接受顯式引數的,唯一的隱式引數只能是它修飾的函式物件。
def spam(a, b, c):
print(a + b + c)
為了更好看,我們重寫dec函式:
# dec3函式可以接受乙個顯式引數,並返回實際的裝飾器
def dec3(value):
# decorator才是實際生效的裝飾器
def decorator(f):
f(*args)
return decorator
@dec3('anything')
def spam(a, b, c):
print(a + b + c)
'''實際的效果是:
decorator = dec3('anything')
@decorator
def spam(a, b, c):
print(a + b + c)
'''
# python新手,如有錯漏,還請指教。 python 帶引數裝飾器
在前面一文 python裡為什麼需要使用裝飾器 decorator 裡,我們學習了為什麼需要裝飾器,知道裝飾器就是為了不修改原來函式的 又達到增加功能的作用。其實為了裝飾器更通用化,那麼裝飾器是否也可以帶引數呢?其實是可以的,這樣更加通用化了,達到共享極點。在前面也學習 為什麼要使用閉包 closu...
python 實現帶引數的裝飾器
coding utf8 author bluesli defbefore request,kwarg print before defafter request,kwarg print after deffilter before fun,after fun defouter main fun de...
python 之 帶引數的裝飾器
from functools import wraps deflogit logfile out.log deflogging decorator func wraps func def args,kwargs log string func.name was called print log st...