3 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
正確的方法是返回包裝的函數(shù)并在返回之前更改它:
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屬性兩次:
第一次在包裝器中將原始函數(shù)的屬性設(shè)置為 0 并在調(diào)用原始函數(shù)后打印它
然后,當(dāng)從包裝器調(diào)用原始函數(shù)時(shí),它將引用 as 的函數(shù)f_out的屬性設(shè)置為1。但在那一刻,引用 as 的函數(shù)f_out是被封裝的函數(shù),不再是原始函數(shù)。
因此,當(dāng)您稍后打印時(shí),f_out.var您將打印包裝函數(shù)的屬性,即 1。
這是一個(gè)稍微修改的代碼來演示它:
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貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超8個(gè)贊
當(dāng)您調(diào)用它時(shí),裝飾器正在包裝您的函數(shù)。因此,當(dāng)您調(diào)用f_out()它時(shí),它會(huì)返回1. 您調(diào)用的是包裝函數(shù),而不是定義。
@wrapper
def f_out()
wrapper(f_out)當(dāng)你調(diào)用它時(shí)相等 。
當(dāng)您嘗試打印時(shí),f_out.var它會(huì)返回函數(shù)定義中的值。

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