【python小白】 問關于之初始化一次對象的問題
問題描述
代碼如下:
# -*- 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('旺財')print(id(a))print(a.name)b = Dog('哮天犬')print(id(b))print(b.name)
執(zhí)行結(jié)果:
我的問題:
按照我的想法,我的這段代碼當中寫的是,設計了一個Dog的類,然后創(chuàng)建一個單例對象(第一個紅色方框中的代碼),也就是說,最終的實例a和b實際上是同一個東西。然后我又把這個單例對象設置了,只初始化一次(見第二個紅色方框中的代碼),換句話說,a這個實例創(chuàng)建了之后,名字叫旺財,那么b這個實例創(chuàng)建之后,應該不會初始化,那么哮天犬這個名字應該不可能打印出來。按照我的想法,應該打印的結(jié)果是兩個旺財。為什么現(xiàn)在結(jié)果跟我設想的不太一樣?
問題解答
回答1:其實你已經(jīng)實現(xiàn)了單例對象了, 從id的結(jié)果已經(jīng)看出來了, 至于為什么你兩次的結(jié)果會不一樣呢? 因為創(chuàng)建返回是一回事, 初始化又是一回事, 在__new__里面, 確認了不會創(chuàng)建新實例, 返回的是舊實例, 但是這并不影響下一步的__init__初始化動作啊, 而且你修改的__init_flag = True只是在實例對象里面而已, 并沒有修改到類那邊, 所以你的判斷在無效的, 只有修改到類那邊的__init_flag才有效, 所以代碼修正為:
class Dog(object): ....(其他內(nèi)容請自行補充)... def __init__(self, name): # self.name = name if not self.__init_flag:# __init_flag = Trueself.name = nameDog.__init_flag = True # 修改基類的__init_flag
另外有兩個小建議:
判斷對象是否None時, 不要用==, 應該用is: cls.__instance is None
判斷是否等于false, 也不要用==, 應該是not: if not self.__init_flag
相關文章:
1. macos - mac 重啟后 XAMPP下的apache無法啟動2. css3 - 這個右下角折角用css怎么畫出來?3. mysql - eclispe無法打開數(shù)據(jù)庫連接4. windows2003下的apache響應時間特別長?5. javascript - 在 model里定義的 引用表模型時,model為undefined。6. 關于Java引用傳遞的一個困惑?7. java - 根據(jù)月份查詢多個表里的內(nèi)容怎么實現(xiàn)好?8. javascript - 一個關于客戶端和前端通信的疑惑?9. php - 一個操作請求多個服務如何保證數(shù)據(jù)的安全?10. javascript - webpack熱加載配置不生效
