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!