程式碼如下:
## -*- 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這個實例創建之後,應該不會初始化,那麼哮天犬這個名字應該不可能印出來。按照我的想法,應該印出來的結果是兩個旺財。為什麼現在結果跟我設想的不太一樣?
其實你已經實現了單例對象了, 從
才有效, 所以代碼修正為:id
的結果已經看出來了, 至於為什麼你兩次的結果會不一樣呢? 因為創建返回是一回事, 初始化又是一回事, 在__new__
裡面, 確認了不會創建新實例, 返回的是舊實例, 但是這並不影響下一步的__init__
初始化動作啊, 而且你修改的__init_flag = True
只是在裡面實例對象
實例對象而已, 沒有修改到
類那邊, 所以你的判斷在無效的, 只有修改到
類那邊的
__init_flag判斷物件是否None時, 不要用
==, 應該用
is:
cls.__instance is None判斷是否等於
false, 也不要用
==, 應該是
not:
if not self.__init_flag