# 首先了解object類執行個體化對象時候使用new的時候發生了什麼
# class Person():
# def __init__(self):
# print('這是init方法')
#
#
# a = Person() # 不重寫object的new方法不采用單例化模式的時候,則每執行個體化一個對象
# b = Person() # object的new方法會建立一塊記憶體位址去存儲這個執行個體化對象
# print(id(a)) # 是以每個執行個體化對象的記憶體位址都是不一樣的,分别會調用init初始化方法,初始化
# print(id(b))
# 其次在子類中重寫new方法
class Person(object):
zheshibenshen = None
def __new__(cls):
if cls.zheshibenshen == None:
cls.zheshibenshen = super().__new__(cls)
return cls.zheshibenshen
def __init__(self):
print('這是init方法')
a = Person() # 這裡重寫了父類object的new方法,使這個類每次執行個體化對象的時候總是傳回zheshibenshen(即它自己)
b = Person() # 第一次執行個體化時,這裡就是重新調用object的new方法,建立一個記憶體位址存放執行個體對象
# 不重寫new,object也會執行super().__new__(Person)這個方法,建立一個記憶體位址存放執行個體
print(id(a)) # 然後再把它指派給zheshibenshen然後傳回它,它們其實就是這個類第一次執行個體化時的對象
# # 到這裡為止跟不重寫new方法時的過程是一樣的,重點是後面這個類再去執行個體化對象的時候
# # 也就是說以後再執行個體化對象的時候,每次new都會判斷這個執行個體化的對象,它自己是不是空,不是空就傳回它自己
print(id(b)) # 是以每次執行個體化對象的時候,(重寫後)每次new方法裡傳回的都是第一個執行個體化對象
# 都指向的第一個執行個體化的記憶體位址,是以不管以後執行個體化多少個對象,都是同一個記憶體位址裡的同一個東西