python單例模式

python 單例模式

一、什麼是單例模式

單例模式(Singleton Pattern)是一種經常使用的軟件設計模式,該模式的主要目的是確保某一個類只有一個實例存在。當你但願在整個系統中,某個類只能出現一個實例時,單例對象就能派上用場。設計模式

好比,某個服務器程序的配置信息存放在一個文件中,客戶端經過一個 AppConfig 的類來讀取配置文件的信息。若是在程序運行期間,有不少地方都須要使用配置文件的內容,也就是說,不少地方都須要建立 AppConfig 對象的實例,這就致使系統中存在多個 AppConfig 的實例對象,而這樣會嚴重浪費內存資源,尤爲是在配置文件內容不少的狀況下。事實上,相似 AppConfig 這樣的類,咱們但願在程序運行期間只存在一個實例對象。服務器

在 Python 中,咱們能夠用多種方法來實現單例模式。app

二、__new__方法實現

首先,我最推薦使用__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即爲單例類

好啦,單例模式的實現方法大體就是以上幾種了,你們能夠學習學習。資源

相關文章
相關標籤/搜索