首頁  >  問答  >  主體

【python小白】 問關於之初始化一次物件的問題

程式碼如下:

#
# -*- coding:gb2312 -*-
class Dog(object):
    __instance = None
    __init_flag = False
    
    def __new__(cls,name):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
            return cls.__instance
        else:
            return cls.__instance
    def __init__(self,name):
        #self.name = name
        if self.__init_flag == False:
            #__init_flag = True
            self.name = name
            __init_flag = True
a = Dog("旺财")
print(id(a))
print(a.name)

b = Dog("哮天犬")
print(id(b))
print(b.name)

執行結果:

##我的問題:


#依照我的想法,我的這段程式碼當中寫的是,設計了一個Dog的類,然後創建一個單例物件(第一個紅色方框中的程式碼),也就是說,最終的實例a和b其實是同一個東西。
然後我又把這個單例物件設定了,只初始化一次(見第二個紅色方框中的程式碼),換句話說,a這個實例創建了之後,名字叫旺財,那麼b這個實例創建之後,應該不會初始化,那麼哮天犬這個名字應該不可能印出來。按照我的想法,應該印出來的結果是兩個旺財。為什麼現在結果跟我設想的不太一樣?

我想大声告诉你我想大声告诉你2669 天前634

全部回覆(1)我來回復

  • 阿神

    阿神2017-06-28 09:26:24

    其實你已經實現了單例對象了, 從id的結果已經看出來了, 至於為什麼你兩次的結果會不一樣呢? 因為創建返回是一回事, 初始化又是一回事, 在__new__裡面, 確認了不會創建新實例, 返回的是舊實例, 但是這並不影響下一步的__init__初始化動作啊, 而且你修改的__init_flag = True只是在裡面實例對象實例對象而已, 沒有修改到那邊, 所以你的判斷在無效的, 只有修改到那邊的__init_flag

    才有效, 所以代碼修正為:

    class Dog(object):
        ....(其他内容请自行补充)...
        def __init__(self, name):
                # self.name = name
                if not self.__init_flag:
                    # __init_flag = True
                    self.name = name
                    Dog.__init_flag = True   # 修改基类的__init_flag 
    

    另外有兩個小建議:
    1. 判斷物件是否None時, 不要用==, 應該用is: cls.__instance is None

    2. 判斷是否等於false, 也不要用==, 應該是not: if not self.__init_flag

    if not self.__init_flag 🎜🎜🎜 🎜

    回覆
    0
  • 取消回覆