分分鐘帶你理解單例
阿新 • • 發佈:2017-07-28
__name__ col ins 導致 per pre 服務 內容 pri
單例模式的講解以及用處
什麽是單例模式用處何在?
答:單例模式(Singleton Pattern)是一種常用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實列存在,當你希望整個系統中只能出現一個實列時,這個時候單例對象就可以派上用場了。
舉個列子!!
比如、某個服務器程序的配置信息存放在一個文件中,客戶端通過一個AppConfig的類來讀取配置文件的信息。如果在程序運行期間,有很多地方都需要使用配置文件的內容,也就是說,很多地方都需要創建AppConfig對象實列,這就導致系統中存在多個AppConfig的實列對象,而這樣會嚴重浪費內存資源,尤其是在配置文件內容很多的情況下,事實上類似AppConfig這樣的類,我們希望在程序運行期間只存在一個實例對象。
用 __new__來創建單例
如果想使得某個類從始至終最多只有一個實例,使用__new__方法會很簡單,Python中類是通過__new__來創建實例的。
1 class A(object): 2 def __new__(cls, *args, **kwargs): 3 if not hasattr(cls,‘_inst‘): 4 cls._inst = super(A, cls).__new__(cls, *args, **kwargs) 5 return cls._inst 6 if __name__== ‘__main__‘: 7 class B(A): 8 def __init__(self,s): 9 self.s = s 10 ret = A() 11 ret1 = B(‘two‘) 12 print id(ret),ret 13 print id(ret1),ret1.s 14 15 #結果 16 53445264 <__main__.A object at 0x032F8290> 17 53445392 two
通過__new__方法,將類的實例在創建的時候綁定到類屬性_inst,如果cls._inst為None,說明類還沒實例化,實列化並將實例綁定到cls._inst,以後每次實例化的時候都返回第一次實列化創建的實例,註意從A派生子類的時候,不要重載__new__。
分分鐘帶你理解單例