Python中的裝飾器 Decorator

2021-07-02 13:04:43 字數 2139 閱讀 3609

# 注:本文參考廖雪峰老師的部落格

所謂裝飾器(decorator)

就是乙個返回函式的高階函式,它可以在執行期間動態的增加函式的功能。

首先看乙個簡單的例子:

>>> def now():

print '2015-05-12'

>>>

>>> now()

2015-05-12

現在我想增加一些功能,但又不想改變原來函式。我們就可以使用裝飾器。

>>> def log(func):

print 'call %s():' % func.__name__

return func(*args, **kw)

>>> @log

def now():

print '2015-05-12'

>>> now()

call now():

2015-05-12

把@log放到now()函式的定義處相當於執行了語句:

now = log(now)

>>> now.__name__

若裝飾器想帶引數,就要加多一層巢狀了。

>>> def log(text):

def decorotar(func):

print '%s function %s():' % (text, func.__name__)

return func(*args, **kw)

return decorotar

>>>

>>> @log('execute')

... def now():

... print '2015-05-12'

...

>>> now()

execute function now():

2015-05-12

帶了引數後的裝飾器相當於執行log('execute')(now),即:首先執行的是log('execute'),返回decorator函式,

>>> now.__name__

但,這樣跟我們原來設想的就會有出入了。因為,我們認為__name__這個屬性返回的應該是我們原本呼叫的函式名稱,即:now

而,python內建的functools.wraps就可以幫助我們來解決以上的問題。所以,乙個完整的裝飾器是這樣寫的:

>>> import functools

>>> def log(func):

... @functools.wraps(func)

... print 'call %s():' % func.__name__

... return func(*args, **kw)

...

>>> @log

... def now():

... print '2015-05-12'

...

>>> now.__name__

'now'

帶引數的裝飾器:

>>> import functools

>>> def log(text):

... def decorator(func):

... @functools.wraps(func)

... print '%s function %s():' % (text, func.__name__)

... return func(*args, **kw)

... return decorator

...

>>> @log('execute')

... def now():

... print '2015-05-12'

...

>>> now.__name__

'now'

>>> now()

execute function now():

2015-05-12

python中的裝飾器

其實去年就開始學python了,零零散散,陸陸續續學了點,期間學習了python web開發,爬蟲系統 但是一些基礎性的知識點長時間不看了就會忘,所以寫個部落格記錄下來,忘了可以隨時檢視,不用回去看 了,希望也能幫助大家學習哈。python中的裝飾器decorator其實是乙個高階函式,它接受乙個函...

Python 中的裝飾器

1.基本概念 問題 裝飾器是什麼?解答 嚴格來說,裝飾器只是語法糖,裝飾器是可呼叫的物件,可以像常規的可呼叫物件那樣呼叫,特殊的地方是裝飾器的引數是乙個函式 問題 裝飾器有什麼特性?解答 裝飾器有 個特性,一是可以把被裝飾的函式替換成其他函式,二是可以在載入模組時候立即執行 def decorate...

python中的 裝飾器

示例 def fun a arg print a arg fun a deffun b print b 輸出 c python34 python.exe c users administrator desktop test.pyab process finished with exit code 0...