1、"""單例設計模式:通俗的講就是單個實例對象
設計模式:前人在工做中,爲了作需求寫代碼積累的一種代碼設計思想,咱們根據套路來就好了
>>>>>>>
以前講過的建立類實例對象,工做原理是這樣的---調用類建立對象,解釋器會自動調用__new__這個內置的靜態方法爲對象分配內存空間
,而後返回這個對象,再將這個對象的引用傳給__init__初始化方法進行初始化。這是工做原理,可是在建立多個對象時,給對象分配
內存空間的內存地址是不同的,也就是多個實例,接下來單例就是要將建立多個對象時,分配的內存空間的內存地址始終是惟一一個,這就叫單例
"""
這幅圖是描述調用類建立對象時的工做原理:
實現單例的代碼:
class Person(object): instance_neicun = None # 用類屬性記錄建立對象時的內存地址 def __new__(cls, *args, **kwargs): # 重寫new方法 if cls.instance_neicun is None: cls.instance_neicun = super().__new__(cls) # 用一個變量接收object類中new方法返回的內存地址,new是一個特殊的靜態 #方法,調用時須要傳遞cls參數 return cls.instance_neicun # new方法須要返回一個對象, def __init__(self): print('初始化開始...') a = Person() print(a) b = Person() print(b)
輸出結果:
初始化開始...
<單例設計模式.Person object at 0x0000000001730748>
初始化開始...
<單例設計模式.Person object at 0x0000000001730748>
此時你會發現,我建立倆個對象時,內存地址都是同樣的!
2、上面的代碼你會發現,初始化內容每調用一次就會輸出一次,那麼若是隻要輸出一次怎麼作呢?只須要將上述代碼作一點修改就能夠了
class Person(object): instance_neicun = None # 用類屬性記錄建立對象時的內存地址 instance_flag = False # 是否執行過初始化方法的標記 def __new__(cls, *args, **kwargs): # 重寫new方法 if cls.instance_neicun is None: cls.instance_neicun = super().__new__(cls) # 用一個變量接收object類中new方法返回的內存地址,new是一個特殊的靜態 #方法,調用時須要傳遞cls參數 return cls.instance_neicun # new方法須要返回一個對象, def __init__(self): # 判斷若是初始化方法被調用過一次,就直接返回 if Person.instance_flag is True: return # 若是沒有調用過,就進行初始化 print('初始化開始...') # 修改標記 Person.instance_flag = True a = Person() print(a) b = Person() print(b)
輸出結果:
初始化開始...
<單例設計模式.Person object at 0x000000000170F668>
<單例設計模式.Person object at 0x000000000170F668>
此時你會發現,建立倆個對象,只輸出了一個初始化內容