【python小白】 問關於之初始化一次物件的問題
我想大声告诉你
我想大声告诉你 2017-06-28 09:24:24
0
1
649

程式碼如下:

#
# -*- 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這個實例創建之後,應該不會初始化,那麼哮天犬這個名字應該不可能印出來。按照我的想法,應該印出來的結果是兩個旺財。為什麼現在結果跟我設想的不太一樣?

我想大声告诉你
我想大声告诉你

全部回覆(1)
阿神

其實你已經實現了單例對象了, 從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 🎜🎜🎜 🎜
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!