【python小白】 問關(guān)于之初始化一次對(duì)象的問題
問題描述
代碼如下:
# -*- coding:gb2312 -*-class Dog(object): __instance = None __init_flag = Falsedef __new__(cls,name):if cls.__instance == None: cls.__instance = object.__new__(cls) return cls.__instanceelse: return cls.__instance def __init__(self,name):#self.name = nameif self.__init_flag == False: #__init_flag = True self.name = name __init_flag = Truea = Dog('旺財(cái)')print(id(a))print(a.name)b = Dog('哮天犬')print(id(b))print(b.name)
執(zhí)行結(jié)果:

我的問題:
按照我的想法,我的這段代碼當(dāng)中寫的是,設(shè)計(jì)了一個(gè)Dog的類,然后創(chuàng)建一個(gè)單例對(duì)象(第一個(gè)紅色方框中的代碼),也就是說,最終的實(shí)例a和b實(shí)際上是同一個(gè)東西。然后我又把這個(gè)單例對(duì)象設(shè)置了,只初始化一次(見第二個(gè)紅色方框中的代碼),換句話說,a這個(gè)實(shí)例創(chuàng)建了之后,名字叫旺財(cái),那么b這個(gè)實(shí)例創(chuàng)建之后,應(yīng)該不會(huì)初始化,那么哮天犬這個(gè)名字應(yīng)該不可能打印出來。按照我的想法,應(yīng)該打印的結(jié)果是兩個(gè)旺財(cái)。為什么現(xiàn)在結(jié)果跟我設(shè)想的不太一樣?
問題解答
回答1:其實(shí)你已經(jīng)實(shí)現(xiàn)了單例對(duì)象了, 從id的結(jié)果已經(jīng)看出來了, 至于為什么你兩次的結(jié)果會(huì)不一樣呢? 因?yàn)閯?chuàng)建返回是一回事, 初始化又是一回事, 在__new__里面, 確認(rèn)了不會(huì)創(chuàng)建新實(shí)例, 返回的是舊實(shí)例, 但是這并不影響下一步的__init__初始化動(dòng)作啊, 而且你修改的__init_flag = True只是在實(shí)例對(duì)象里面而已, 并沒有修改到類那邊, 所以你的判斷在無效的, 只有修改到類那邊的__init_flag才有效, 所以代碼修正為:
class Dog(object): ....(其他內(nèi)容請(qǐng)自行補(bǔ)充)... def __init__(self, name): # self.name = name if not self.__init_flag:# __init_flag = Trueself.name = nameDog.__init_flag = True # 修改基類的__init_flag
另外有兩個(gè)小建議:
判斷對(duì)象是否None時(shí), 不要用==, 應(yīng)該用is: cls.__instance is None
判斷是否等于false, 也不要用==, 應(yīng)該是not: if not self.__init_flag
相關(guān)文章:
1. 運(yùn)行python程序時(shí)出現(xiàn)“應(yīng)用程序發(fā)生異常”的內(nèi)存錯(cuò)誤?2. android - Genymotion 模擬器可以做屏幕適配檢測(cè)嗎?3. macos - 無法source activate python274. java - butterknife怎么綁定多個(gè)view5. java - 同步/異步與阻塞/非阻塞之間的差異具體是什么?6. css3 讓圖片變成灰色(filter),但針對(duì)IE11瀏覽器無效7. html - vue里面:src在IE(9-11)下不顯示圖片8. html5 - 前端面試碰到了一個(gè)緩存數(shù)據(jù)的問題,來論壇上請(qǐng)教一下9. javascript - 打算寫一個(gè)c++的node圖像處理模塊,有沒有推薦的c++圖片處理庫(kù)?10. css - 移動(dòng)端 盒子內(nèi)加overflow-y:scroll后 字體會(huì)變大

網(wǎng)公網(wǎng)安備