3 回答

TA貢獻1906條經驗 獲得超3個贊
正確的方法是返回包裝的函數并在返回之前更改它:
def wrapper(func):
def wrapped(*args, **kwargs):
return func(*args, **kwargs)
wrapped.var = 0
return wrapped
@wrapper
def f_out():
print(f_out.var)
你正確地得到:
print(f_out())
給
0
更新的剪輯更改了var屬性兩次:
第一次在包裝器中將原始函數的屬性設置為 0 并在調用原始函數后打印它
然后,當從包裝器調用原始函數時,它將引用 as 的函數f_out的屬性設置為1。但在那一刻,引用 as 的函數f_out是被封裝的函數,不再是原始函數。
因此,當您稍后打印時,f_out.var您將打印包裝函數的屬性,即 1。
這是一個稍微修改的代碼來演示它:
def wrapper(func):
def wrapped(*args, **kwargs):
wrapped.orig = func # keeps a ref to the original function
func.var = 0
ret = func(*args, **kwargs)
print(func.var)
return wrapped
@wrapper
def f_out():
f_out.var = 1
f_out()
print(f_out.var, f_out.orig.var)
它打印
0
1 0

TA貢獻1784條經驗 獲得超8個贊
當您調用它時,裝飾器正在包裝您的函數。因此,當您調用f_out()它時,它會返回1. 您調用的是包裝函數,而不是定義。
@wrapper
def f_out()
wrapper(f_out)當你調用它時相等 。
當您嘗試打印時,f_out.var它會返回函數定義中的值。

TA貢獻1863條經驗 獲得超2個贊
return wrapped如果return func試試這個,你必須添加:
def wrapper(func):
def wrapped(*args, **kwargs):
func.var = 0
return func(*args, **kwargs)
return wrapped
@wrapper
def f_out():
print(f_out.var)
添加回答
舉報