在函式物件中儲存著一些函式的元資料,例如:
__name__ 函式的名字
__doc__ 函式文件字串
__module__ 函式所屬模組名
__dict__ 屬性字典
__default__ 預設引數元組
...
在使用裝飾器後,再訪問上面這些屬性時,看到的是內部包裹函式的元資料,原來函式的元資料便丟失了。
要求:為被裝飾函式儲存元資料。
解決方案:
使用標準庫functools中的wraps
裝飾內部包裹函式,可以指定將原函式的某些屬性,更新到包裹函式。
>>
>
>>
('__module__'
,'__name__'
,'__qualname__'
,'__doc__'
,'__annotations__'
)>>
>
>>
('__dict__'
,)
defmy_decorator
(func)
:def
wrap
(*args ,
**kwargs)
:'''某功能包裹函式'''
#此處實現某種功能
return func(
*args ,
**kwargs)
#保留被裝飾函式元資料
return wrap
@my_decorator
def***_func
(a, b)
:'''***_func函式文件:...'''
pass
(***_func.__name__)
(***_func.__doc__)
***_func #結果
***_func函式文件:..
.
from functools import wraps
defmy_decorator
(func)
: @wraps(func)
#保留被裝飾函式元資料
defwrap
(*args ,
**kwargs)
:'''某功能包裹函式'''
#此處實現某種功能
return func(
*args ,
**kwargs)
return wrap
@my_decorator
def***_func
(a, b)
:'''***_func函式文件:...'''
pass
print
(***_func.__name__)
print
(***_func.__doc__)
***_func #結果
***_func函式文件:
..
上面兩種方案都可以為被裝飾函式儲存元資料,方案2更為簡便。 使用裝飾器為Python函式做快取
寫了個函式作為裝飾器為fibonacci數列做快取,做了一下效能比較。usr bin python coding utf 8 import datetime now datetime.datetime.now from functools import wraps def cache func ca...
python 函式裝飾 Python 函式裝飾器
無引數的 函式裝飾器 funa 作為裝飾器函式 def funa fn print sakura func a fn 執行傳入的fn引數 print sakura second return sakura return funa def funb print sakurab 返回結果為 sakura...
python 函式裝飾 Python 函式裝飾器
首次接觸到裝飾器的概念,太菜啦!python 裝飾器可以大大節省 的編寫量,提公升 的重複使用率。函式裝飾器其本質也是乙個函式,我們可以把它理解為函式中定義了乙個子函式。例如我們有這麼乙個需求,每次執行乙個函式後,需要知道這個函式執行了多長時間。一般情況下,我會這樣寫 defaccumulate n...