【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. java中返回一個(gè)對(duì)象,和輸出對(duì)像的值,意義在哪兒2. docker網(wǎng)絡(luò)端口映射,沒有方便點(diǎn)的操作方法么?3. mysql - 在不允許改動(dòng)數(shù)據(jù)表的情況下,如何優(yōu)化以varchar格式存儲(chǔ)的時(shí)間的比較?4. docker start -a dockername 老是卡住,什么情況?5. css3 - 純css實(shí)現(xiàn)點(diǎn)擊特效6. apache web server 怎么限制某一個(gè)網(wǎng)站對(duì)服務(wù)器資源的占用?7. javascript - 關(guān)于apply()與call()的問題8. docker - 各位電腦上有多少個(gè)容器啊?容器一多,自己都搞混了,咋辦呢?9. 安全性測試 - nodejs中如何防m(xù)ySQL注入10. python - pandas dataframe如何對(duì)某列的空數(shù)據(jù)位置進(jìn)行update?update的函數(shù)是自定義的,參數(shù)是同一行的另外兩列數(shù)據(jù)
