# 注:本文參考廖雪峰老師的部落格
所謂裝飾器(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...