目錄python
單例模式(Singleton Pattern)是一種經常使用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你但願在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。設計模式
好比,某個服務器程序的配置信息存放在一個文件中,客戶端經過一個 AppConfig 的類來讀取配置文件的信息。若是在程序運行期間,有不少地方都須要使用配置文件的內容,也就是說,不少地方都須要建立 AppConfig 對象的實例,這就致使系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內存資源,尤爲是在配置文件內容不少的狀況下。事實上,相似 AppConfig 這樣的類,咱們但願在程序運行期間只存在一個實例對象。服務器
在 Python 中,咱們能夠用多種方法來實現單例模式。app
首先,我最推薦使用__new__方法來實現單例模式,由於我以爲這種方法是最容易理解的。咱們知道__new__方法是類在實例化過程當中調用的一個方法,該方法還要在__init__方法以前調用,用於建立類的實例化對象。那麼咱們是否是能夠重寫__new__ ,讓他判斷是否已經調用過該方法了,若是已經調用過了,直接返回上次實例化的對象,那麼該類不就一直只存在一個實例化對象了嗎,就實現了單例,例子以下。學習
class Singleton(object): def __new__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs) rerurn cls._instance class A(Singleton): pass # 類A即爲單例類
咱們能夠寫一個裝飾器,來裝飾咱們須要指定的單例類,這樣也能夠實現。設計
def singleton(cls): instance = {} def wapper(): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return wapper @singleton class C: pass # 類C即爲單例類
咱們知道,在python中,咱們能夠本身寫一個py文件,裏面的類或者方法就能夠經過模塊導入。在python中,用模塊導入的類就是一個自然的單例。code
# 做爲Python模塊時是自然的單例模式 #建立一個sington.py文件,內容以下: class Singleton(object): def foo(self): pass mysington = Singleton() # 運用 from sington import mysington
建立實例時把全部實例的__dict__指向同一個字典,這樣它們都具備相同的屬性和方法(類的__dict__存儲對象屬性)對象
class Singleton(object): _state = {} def __new__(cls, *args, **kwargs): ob = super(Singleton,cls).__new__(cls, *args, **kwargs) ob.__dict__ = cls._state return ob class B(Singleton): pass # 類B即爲單例類
最後一種方法使用元類實現單例模式,這種方法比較不容易理解,首先須要理解元類是什麼,這裏就不展開細講了,有興趣的同窗能夠自行學習元類的用法。內存
class Singleton(type): _instacne = {} def __call__(cls,*args,**kwargs): if cls not in cls._instance: cls._instances[cls] = super(Singleton, cls).__call__(*args,**kwargs) #以cls爲key,cls(*args, **kwargs) 爲值放入盛放單例的字典 return cls._instance[cls] class MyClass(metaclass=Singleton): pass #MyClass即爲單例類
好啦,單例模式的實現方法大體就是以上幾種了,你們能夠學習學習。資源