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

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

python裝飾器

python裝飾器

守著一只汪 2018-08-10 16:53:47
from functools import wrapsdef single(cls):     sets={}     print(sets)       @wraps(cls)     def wrapper(*args,**kw):         if 'ex' not in sets:             sets['ex']=cls(*args,**kw)        return sets['ex']    return wrapper@singleclass B:     passb=B() b.a="hello bachelor"a=B() d=single(B) print(c.a)通過裝飾器實現(xiàn)的單例模式,但是有一個地方不是特別理解:代碼中通過object=B()這種方式創(chuàng)建兩個B的實例,為什么 sets={} print(sets)這段只被執(zhí)行了一次。另一個不解的地方是@decoratorclass B:    pass不是等價于 decorator(B)的嗎但是在代碼中如果用 d=single(B)這種寫法, sets={} 這一段卻會被執(zhí)行。
查看完整描述

1 回答

?
繁花如伊

TA貢獻2012條經(jīng)驗 獲得超12個贊

簡單來說:

  • print代碼只是在裝飾器第一次聲明class B時調(diào)用,去掉下面的代碼也會執(zhí)行

b=B()b.a="hello bachelor"a=B()
d=single(B)print(c.a)
  • d=single(B)相當于重新執(zhí)行了一遍single函數(shù),自上而下

PS:你可以首部使用下方代碼看下具體執(zhí)行過程(輸入s單步執(zhí)行)

import pdb;pdb.set_trace()


查看完整回答
反對 回復 2018-08-12
  • 1 回答
  • 0 關注
  • 692 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號