Python進階(三)單例設計模式

  在瞭解python的單例設計模式之前,我們需要先知道什麼是設計模式:前人工作的總結和提煉,通常,被人們廣泛流傳的設計模式都是針對某一特定問題的成熟解決方案。

  使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。

單例設計模式

  • 目的:讓類創建的對象,在系統中只有唯一的一個實例。每一次執行類名()返回的對象,內存地址是相同的。像音樂播放這樣就是單例的。

  使用類名()創建對象時,python的解釋器首先會調用__new__方法爲對象分配空間。然後__init__初始化對象。所以在單例設計模式中想要返回固定的內存空間,就需要重寫__new__方法。而想要重寫__new__方法就需要知道其主要做了哪些事情:

  1. 在內存中爲對象分配空間
  2. 返回對象的引用(內存地址)。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>

  說明Player1Player2是相同的一個對象。內存中只有唯一一個對象。單上述代碼的初始化方法__init__會被運行兩次。要想初始化一次的話,可以定義一個類屬性init_flag標記是否執行過初始化動作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章