#單例模式:使一個類只產生一個對象。他們的id地址都指向同一個內存地址
第一步:理解誰創建了對象
# 單例模式
# 首先明白,我們在創建一個類的對象的時候,其實是調用的這個類的父類,即繼承object,
# 然后調用這個object的new方法來創建一個對象。
# 創建對象后,才會執行__init__方法,進行初始化
# 第一步: class Person: __instance = None def __new__(cls, *args, **kwargs): print("1111") def __init__(self): print("創建對象后,進行初始化") p = Person() #結果 1111 #從結果分析:我自己創建的這個new方法,會先執行我自己的new方法,但是並沒有產生對象(因為沒有執行__init__方法) # 我們創建對象的時候,是object這個原類幫助我們產生了對象。所以我們要調用父類(object)的new方法來產生一個對象。
第二步理解對象的執行順序:
# 因此:下面的這個方法才能幫助我們產生一個對象。
class Person: __instance = None def __new__(cls, *args, **kwargs): print(111) obj=object.__new__(cls) # 傳入我們要產生對象的這個類 return obj def __init__(self): print("創建對象后,進行初始化") p1=Person() # 111 # 創建對象后,進行初始化 ''' 結果分析: 我調用了objcet的__new__方法,幫助我產生了一個對象,並且這個對象也執行了__init__方法。 '''
第三步:理解怎么才能只創建一個對象,通過什么條件來只創建一個對象
# 通過上面兩個的案例理解。我知道了我應該調用父類的new方法來創建一個對象,
並且我希望這個,再次創建對象的時候,創建的對象還是剛開始創建的那個對象。
所以我希望用定義的私有變量來做個判斷,如果私有變量__instance有值 我則直接
返回剛開始創建的那個對象。如果沒有創建,則調用父類new方法創建一個對象。
class Person: __instance = None def __new__(cls, *args, **kwargs): print("1111") if Person.__instance is None: # 只有第一次的時候,條件是None,所以第一次的時候才創建一個對象,后面的條件都不是false,所以直接返回第一次創建的對象 obj = object.__new__(cls) # 繼承調用object的new方法產生一個對象 Person.__instance = obj # 將這個對象賦值給這個類的私有變量__instance return Person.__instance def __init__(self): print("創建對象后,進行初始化") p1 = Person() p2 = Person() p3 = Person() p4 = Person() print(id(p1),id(p2),id(p3),id(p4)) 輸出結果:顯示4個對象的內存地址都一樣 416664513336 416664513336 416664513336 416664513336