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()
添加回答
舉報
0/150
提交
取消