Python 中單例模式的實現方法
更新時間:2022年08月29日 11:56:12 作者:鋼鐵男兒
這篇文章主要介紹了Python 中單例模式的實現方法,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,感興趣的小伙伴可以學習一下下面文章詳細內容
單例 — 讓 類 創(chuàng)建的對象,在系統(tǒng)中 只有唯一的一個實例;
- 1)、定義一個類屬性,初始值是 None ,用于記錄 單例對象的引用;
- 2)、重寫 new 方法;
- 3)、如果 類屬性 is None,調用父類方法分配空間,并在類屬性中記錄結果;
- 4)、返回 類屬性 中記錄的 對象引用;
class MusicPlayer(object): # 記錄第一個被創(chuàng)建對象的引用 instance = None def __new__(cls, *args, **kwargs): # 判斷類屬性是否是空對象 if cls.instance is None: # 調用父類的方法,為第一個對象分配空間 cls.instance = super().__new__(cls) # 返回類屬性保存的對象引用 return cls.instance # 創(chuàng)建多個對象 play1 = MusicPlayer() print(play1) play2 = MusicPlayer() print(play2)
只執(zhí)行一次初始化工作:在每次使用 類名() 創(chuàng)建對象時,Python 的解釋器都會自動調用兩個方法:
- 1)、new 分配空間;
- 2)、init 對象初始化;
new 方法改造之后,每次都會得到 第一次被創(chuàng)建對象的引用,但是,初始化方法還會被兩次調用;
需求:讓 初始化動作 只被 執(zhí)行一次;
解決辦法:
- 1)、定義一個類屬性 _init_flag 標記是否 執(zhí)行初始化動作,初始值為 False;
- 2)、在 init 方法中,判斷 _init_flag,如果為 False 就執(zhí)行初始化動作;
- 3)、然后將 _init_flag 設置為 True;
- 4)、這樣,再次 自動 調用 init 方法時,初始化動作就不會被再次執(zhí)行;
class MusicPlayer(object): # 記錄第一個被創(chuàng)建對象的引用 instance = None # 記錄是否執(zhí)行過初始化動作 init_flag = False def __new__(cls, *args, **kwargs): # 判斷類屬性是否是空對象 if cls.instance is None: # 調用父類的方法,為第一個對象分配空間 cls.instance = super().__new__(cls) # 返回類屬性保存的對象引用 return cls.instance def __init__(self): # 判斷是否執(zhí)行過初始化動作 if MusicPlayer.init_flag: return # 如果沒有執(zhí)行過,在執(zhí)行初始化動作 print("初始化播放器") # 修改類屬性的標記 MusicPlayer.init_flag = True # 創(chuàng)建多個對象 play1 = MusicPlayer() print(play1) play2 = MusicPlayer() print(play2)
到此這篇關于Python 中單例模式的實現方法的文章就介紹到這了,更多相關Python 單例內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python圖像處理實現兩幅圖像合成一幅圖像的方法【測試可用】
這篇文章主要介紹了Python圖像處理實現兩幅圖像合成一幅圖像的方法,結合實例形式分析了Python使用Image.blend()接口與Image.composite()接口進行圖像合成的相關操作技巧,需要的朋友可以參考下2019-01-01