Python裝飾器如何實現修復過程解析

2022-09-28 21:45:22 字數 1381 閱讀 2468

python裝飾器(decorator)在實現的時候,被裝飾後的函式其實已經是另外乙個函式了(函式名等函式屬性會發生改變),

為了不影響,python的functools包中提供了乙個叫wraps的decorator來消除這樣的***。寫乙個decorator的時候,最好在實現之前加上functools的wrap,

它能保留原有函式的名稱和docstring。

未加@wraps的時候:

from functools import wraps

def wrapper(func):

# @wraps(func)

def inner(*args, **kwargs):

print("裝飾器工作中...")

func(*args, **kwargs)

return inner

@wrapper

def f1(arg):

"""這是乙個測試裝飾器修復技術的函式

fbeoa:param arg: 隨便傳

:return: 沒有

"""print(arg)

f1('呵呵')

print(f1.__name__,f1.__doc__)

列印結果是:

但是加上@wraps以後:

from functools import wraps

def wrapper(程式設計客棧func):

@wraps(func)

def inner(*args, **kwargs):

print("裝飾器工作中...")

func(*args, **kwargs)

return inner

@wrapper

def f1(arg):

"""這是乙個測試裝飾器修復技術的函式

:param arg: 隨便傳

:return: 沒有

"""print(程式設計客棧arg)

f1('呵呵')

print(f1.__name__,f1.__doc__)

列印結果是:

其中主要的就是兩個變數:

1、顯示 正在執行的函式的名稱 f.name

2、顯示 正在執行的函式的注釋 f.doc

簡單來說就是:

如果沒使用@wraps,當a呼叫了裝飾器b的話,即使a.name,返回的會是裝飾器b的函式名稱,而不是a的函式名稱

如果使用了@wraps,當a呼叫了裝飾器b的話,a.__ name__返回的會是a函式的名稱,而不是飾器b的名稱,

這也即使常說的@wraps是裝飾器的修復技術,

實際就是修復還原了a的fbeoa__ name__變數,同理__ doc__變數也是一樣。

本文標題: python裝飾器如何實現修復過程解析

本文位址:

python修復不了 python中裝飾器修復技術

python裝飾器 wraps作用 修復被裝飾後的函式名等屬性的改變 python裝飾器 decorator 在實現的時候,被裝飾後的函式其實已經是另外乙個函式了 函式名等函式屬性會發生改變 為了不影響,python的functools包中提供了乙個叫wraps的decorator來消除這樣的 寫乙...

python裝飾器 如何使用函式裝飾器

問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...

Python函式的裝飾器修復技術( wraps)

函式的裝飾器修復技術,可使被裝飾的函式在增加了新功能的前提下,不改變原函式名稱,還繼續使用原函式的注釋內容 方便了上下文環境中不去更改原來使用的函式地方的函式名 使用方法 from functools import wraps def 裝飾器 func 寫裝飾器 wraps func 使用裝飾器修復...