單例設計模式 目的:讓類創建對象,在系統中只有唯一的實例,讓每一次創建的對象返回的記憶體地址都是相同的。 __new__方法 使用類名創建對象時,python解釋器首先會調用__new__方法為對象分配空間 __new__方法是有object基類提供的靜態方法,主要作用有兩個: 為記憶體中的對象分配空間 ...
單例設計模式
目的:讓類創建對象,在系統中只有唯一的實例,讓每一次創建的對象返回的記憶體地址都是相同的。
__new__方法
使用類名創建對象時,python解釋器首先會調用__new__方法為對象分配空間
__new__方法是有object基類提供的靜態方法,主要作用有兩個:
- 為記憶體中的對象分配空間
- 返回對象的引用,python解釋器獲得引用後會作為第一個參數返回給__init__方法
python中的單例:
- __new__方法只創建一次空間,返回一次引用
- __init___方法只初始化一次
所以,在python中實現單例需要重寫__new__方法,python中重寫__new__方法非常固定,必須要返回return super().__new__(cls),否則解釋器就得不到對象的引用就不會調用初始化方法,如圖:
python中單例的實現方式:
- 定義一個 類屬性,初始值是
None
,用於記錄 單例對象的引用 - 重寫__new__方法
- 如果 類屬性
is None
,調用父類方法分配空間,併在類屬性中記錄結果 - 返回 類屬性 中記錄的 對象引用
- 讓初始化工作只執行一次
示例代碼如下:
class Single(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 not Single.init_flag: print("初始化對象") Single.init_flag = True s1 = Single() s2 = Single() print(s1) print(s2)
執行結果:
初始化對象 <__main__.Single object at 0x7f4d032f1d68> <__main__.Single object at 0x7f4d032f1d68>