Python 中單例模式的實現方法

單例 — 讓 類 創建的對象,在系統中 隻有唯一的一個實例;

  • 1)、定義一個類屬性,初始值是 None ,用於記錄 單例對象的引用;
  • 2)、重寫 new 方法;
  • 3)、如果 類屬性 is None,調用父類方法分配空間,並在類屬性中記錄結果;
  • 4)、返回 類屬性 中記錄的 對象引用;

class MusicPlayer(object):

    # 記錄第一個被創建對象的引用
    instance = None

    def __new__(cls, *args, **kwargs):

        # 判斷類屬性是否是空對象
        if cls.instance is None:

            # 調用父類的方法,為第一個對象分配空間
            cls.instance = super().__new__(cls)
        # 返回類屬性保存的對象引用
        return cls.instance

# 創建多個對象
play1 = MusicPlayer()
print(play1)

play2 = MusicPlayer()
print(play2)

隻執行一次初始化工作:在每次使用 類名() 創建對象時,Python 的解釋器都會自動調用兩個方法:

  • 1)、new 分配空間;
  • 2)、init 對象初始化;

new 方法改造之後,每次都會得到 第一次被創建對象的引用,但是,初始化方法還會被兩次調用;

需求:讓 初始化動作 隻被 執行一次;

解決辦法:

  • 1)、定義一個類屬性 _init_flag 標記是否 執行初始化動作,初始值為 False;
  • 2)、在 init 方法中,判斷 _init_flag,如果為 False 就執行初始化動作;
  • 3)、然後將 _init_flag 設置為 True;
  • 4)、這樣,再次 自動 調用 init 方法時,初始化動作就不會被再次執行;
class MusicPlayer(object):

    # 記錄第一個被創建對象的引用
    instance = None

    # 記錄是否執行過初始化動作
    init_flag = False

    def __new__(cls, *args, **kwargs):

        # 判斷類屬性是否是空對象
        if cls.instance is None:

            # 調用父類的方法,為第一個對象分配空間
            cls.instance = super().__new__(cls)
        # 返回類屬性保存的對象引用
        return cls.instance

    def __init__(self):
        # 判斷是否執行過初始化動作
        if MusicPlayer.init_flag:
            return
        # 如果沒有執行過,在執行初始化動作
        print("初始化播放器")
        # 修改類屬性的標記
        MusicPlayer.init_flag = True

# 創建多個對象
play1 = MusicPlayer()
print(play1)

play2 = MusicPlayer()
print(play2)

到此這篇關於Python 中單例模式的實現方法的文章就介紹到這瞭,更多相關Python 單例內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: