第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

Python 3.5 裝飾器和函數(shù)字段

Python 3.5 裝飾器和函數(shù)字段

開心每一天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()會(huì)加薪嗎:AttributeError: 'function' object has no attribute 'var'編輯我不得不詳細(xì)說明,因?yàn)榇鸢附o了我替代方案,但這不適用于我想要的情況。鑒于以下代碼段: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為什么會(huì)這樣?
查看完整描述

3 回答

?
一只名叫tom的貓

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


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

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ù)定義中的值。


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

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)


查看完整回答
反對 回復(fù) 2021-11-09
  • 3 回答
  • 0 關(guān)注
  • 166 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)