【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è)紅色方框中的代碼),也就是說(shuō),最終的實(shí)例a和b實(shí)際上是同一個(gè)東西。然后我又把這個(gè)單例對(duì)象設(shè)置了,只初始化一次(見第二個(gè)紅色方框中的代碼),換句話說(shuō),a這個(gè)實(shí)例創(chuàng)建了之后,名字叫旺財(cái),那么b這個(gè)實(shí)例創(chuàng)建之后,應(yīng)該不會(huì)初始化,那么哮天犬這個(gè)名字應(yīng)該不可能打印出來(lái)。按照我的想法,應(yīng)該打印的結(jié)果是兩個(gè)旺財(cái)。為什么現(xiàn)在結(jié)果跟我設(shè)想的不太一樣?
問題解答
回答1:其實(shí)你已經(jīng)實(shí)現(xiàn)了單例對(duì)象了, 從id的結(jié)果已經(jīng)看出來(lái)了, 至于為什么你兩次的結(jié)果會(huì)不一樣呢? 因?yàn)閯?chuàng)建返回是一回事, 初始化又是一回事, 在__new__里面, 確認(rèn)了不會(huì)創(chuàng)建新實(shí)例, 返回的是舊實(shí)例, 但是這并不影響下一步的__init__初始化動(dòng)作啊, 而且你修改的__init_flag = True只是在實(shí)例對(duì)象里面而已, 并沒有修改到類那邊, 所以你的判斷在無(wú)效的, 只有修改到類那邊的__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. mysql儲(chǔ)存json錯(cuò)誤2. 輸入地址報(bào)以下截圖錯(cuò)誤,怎么辦?3. 請(qǐng)問朱老師,如何配置url訪問路由4. mysql分庫(kù)分表量級(jí)疑問5. 為啥獲取不到呀?6. php怎么用isMobile()函數(shù)識(shí)別pc端移動(dòng)端自動(dòng)跳轉(zhuǎn)7. mysql - 這種分級(jí)一對(duì)多,且分級(jí)不平衡的模型該怎么設(shè)計(jì)表?8. node.js - nodejs開發(fā)中常用的連接mysql的庫(kù)9. mysql 5萬(wàn)張表 導(dǎo)出成sql 不要內(nèi)容,只要結(jié)構(gòu),非常慢。如何解決啊?10. php - TP5的登錄驗(yàn)證問題
