對Python中帶引數裝飾器的理解

2021-09-27 01:18:56 字數 1297 閱讀 3110

學習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...