亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python 3.5 裝飾器和函數字段

Python 3.5 裝飾器和函數字段

開心每一天1111 2021-11-09 19:57:22
我有以下代碼片段:def wrapper(func):    def wrapped(*args, **kwargs):        func.var = 0        return func(*args, **kwargs)    return wrapped@wrapperdef f_out():    print(f_out.var)你能解釋一下為什么跑步f_out()會加薪嗎:AttributeError: 'function' object has no attribute 'var'編輯我不得不詳細說明,因為答案給了我替代方案,但這不適用于我想要的情況。鑒于以下代碼段:def wrapper(func):    def wrapped(*args, **kwargs):        func.var = 0        ret = func(*args, **kwargs)        print(func.var)    return wrapped@wrapperdef f_out():    f_out.var = 1f_out()print(f_out.var)我得到作為輸出:01為什么會這樣?
查看完整描述

3 回答

?
一只名叫tom的貓

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


查看完整回答
反對 回復 2021-11-09
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

當您調用它時,裝飾器正在包裝您的函數。因此,當您調用f_out()它時,它會返回1. 您調用的是包裝函數,而不是定義。


@wrapper

def f_out()

wrapper(f_out)當你調用它時相等 。


當您嘗試打印時,f_out.var它會返回函數定義中的值。


查看完整回答
反對 回復 2021-11-09
?
小唯快跑啊

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)


查看完整回答
反對 回復 2021-11-09
  • 3 回答
  • 0 關注
  • 164 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號