在瞭解python
的單例設計模式之前,我們需要先知道什麼是設計模式:前人工作的總結和提煉,通常,被人們廣泛流傳的設計模式都是針對某一特定問題的成熟解決方案。
使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。
單例設計模式
- 目的:讓類創建的對象,在系統中只有唯一的一個實例。每一次執行
類名()
返回的對象,內存地址是相同的。像音樂播放這樣就是單例的。
使用類名()
創建對象時,python
的解釋器首先會調用__new__
方法爲對象分配空間。然後__init__
初始化對象。所以在單例設計模式中想要返回固定的內存空間,就需要重寫__new__
方法。而想要重寫__new__
方法就需要知道其主要做了哪些事情:
- 在內存中爲對象分配空間。
- 返回對象的引用(內存地址)。python的解釋器獲得對象的引用後,將引用作爲第一個參數,傳遞給
__init__
方法。
class Music_Player(object):
def __new__(cls, *args, **kwargs):
print("New Class, Return Address")
return super().__new__(cls)
def __init__(self):
print("Music Init Done")
Music_Player()
>>> New Class, Return Address
Music Init Done
__new__
方法的重寫非常固定,一定要return super().__new__(cls)
。
單例設計模式思路分析
所謂單例設計模式就是在使用這個類創建對象的時候,無論我們多少次創建對象的方法,得到的結果永遠是內存中唯一的那個對象。
class Multic_Player(object):
instance = None
def __new__(cls, *args, **kwargs):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
Player1 = Multic_Player()
print(Player1)
Player2 = Multic_Player()
print(Player2)
>>> __main__.Multic_Player object at 0x7fe7944e00b8>
__main__.Multic_Player object at 0x7fe7944e00b8>
說明Player1
和Player2
是相同的一個對象。內存中只有唯一一個對象。單上述代碼的初始化方法__init__
會被運行兩次。要想初始化一次的話,可以定義一個類屬性init_flag
標記是否執行過初始化動作。