在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  C/ python裝飾器

python裝飾器

from functools import wraps

def 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

@single
class B:
    pass

b=B()
b.a="hello bachelor"
a=B()
d=single(B)
print(c.a)

通過裝飾器實現的單例模式,但是有一個地方不是特別理解:

代碼中通過object=B()這種方式創(chuàng)建兩個B的實例,為什么

 sets={}
 print(sets)

這段只被執(zhí)行了一次。

另一個不解的地方是

@decorator
class B:
    pass
不是等價于
decorator(B)的嗎

但是在代碼中如果用 d=single(B)這種寫法, sets={} 這一段卻會被執(zhí)行。

回答
編輯回答
忘了我

簡單來說:

  • print代碼只是在裝飾器第一次聲明class B時調用,去掉下面的代碼也會執(zhí)行
b=B()
b.a="hello bachelor"
a=B()
d=single(B)
print(c.a)
  • d=single(B)相當于重新執(zhí)行了一遍single函數,自上而下

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

import pdb;pdb.set_trace()
2017年12月26日 22:36