45 為被裝飾函式儲存元資料

2021-10-02 20:08:42 字數 1614 閱讀 2585

在函式物件中儲存著一些函式的元資料,例如:

__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

print

(***_func.__name__)

print

(***_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...