佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > Python實現(xiàn)單例模式的5種方法

Python實現(xiàn)單例模式的5種方法

熱門標簽:鐵路電話系統(tǒng) 網站文章發(fā)布 檢查注冊表項 服務器配置 美圖手機 呼叫中心市場需求 智能手機 銀行業(yè)務

基本介紹

一個對象只允許被一次創(chuàng)建,一個類只能創(chuàng)建一個對象,并且提供一個全局訪問點。

單例模式應該是應用最廣泛,實現(xiàn)最簡單的一種創(chuàng)建型模式。

特點:全局唯一,允許更改

優(yōu)缺點

優(yōu)點:

  • 避免對資源的多重占用,如寫入文件操作
  • 節(jié)省內存
  • 防止命名空間被污染

缺點:

  • 沒有接口,不能繼承,與單一職責原則沖突,一個類應該只關心內部邏輯,而不關心外面怎么樣來實例化

Python實現(xiàn)

方式1,元類實現(xiàn):

class MetaClass(type):
    def __call__(self, *args, **kwargs):
        """
        self : class Singleton
        """
        if not hasattr(self, "ins"):
            insObject = super(__class__, self).__call__(*args, **kwargs)
            setattr(self, "ins", insObject)
        return getattr(self, "ins")


class Singleton(object, metaclass=MetaClass):
    pass


if __name__ == "__main__":
    ins = Singleton()
    print(id(ins))
    ins = Singleton()
    print(id(ins))

方式2,繼承實現(xiàn):

class ParentClass:
    def __new__(cls, *args, **kwargs) -> object:
        """
        cls : class Singeton
        """
        if not hasattr(cls, "ins"):
            insObject = super(__class__, cls).__new__(cls, *args, **kwargs)
            setattr(cls, "ins", insObject)
        return getattr(cls, "ins")


class Singleton(ParentClass):
    pass


if __name__ == "__main__":
    ins = Singleton()
    print(id(ins))
    ins = Singleton()
    print(id(ins))

方式3,裝飾器實現(xiàn):

def warpper(clsObject):
    def inner(*args, **kwargs):
        if not hasattr(clsObject, "ins"):
            insObject = clsObject(*args, **kwargs)
            setattr(clsObject, "ins", insObject)
        return getattr(clsObject, "ins")
    return inner


@warpper
class Singleton:
    pass


if __name__ == "__main__":
    ins = Singleton()
    print(id(ins))
    ins = Singleton()
    print(id(ins))

方式4,模塊實現(xiàn):

- foo.py --> ins = Singleton()
- bar.py --> from foo import ins

方式5,@classmethod實現(xiàn)單例模式:

class Singleton:

    @classmethod
    def getSingletonInstanceObject(cls, *args, **kwargs):
        if not hasattr(cls, "ins"):
            insObject = cls(*args, **kwargs)
            setattr(cls, "ins", insObject)
        return getattr(cls, "ins")


if __name__ == "__main__":
    ins = Singleton.getSingletonInstanceObject()
    print(id(ins))
    ins = Singleton.getSingletonInstanceObject()
    print(id(ins))

到此這篇關于Python實現(xiàn)單例模式的5種方法的文章就介紹到這了,更多相關Python 單例模式內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • python 6種方法實現(xiàn)單例模式
  • python 實現(xiàn)單例模式的5種方法
  • python單例模式的多種實現(xiàn)方法
  • 詳解python實現(xiàn)線程安全的單例模式
  • 基于Python中單例模式的幾種實現(xiàn)方式及優(yōu)化詳解
  • Python單例模式的兩種實現(xiàn)方法
  • 5種Python單例模式的實現(xiàn)方式
  • 常見的在Python中實現(xiàn)單例模式的三種方法

標簽:紅河 滄州 長治 上海 河南 樂山 新疆 沈陽

巨人網絡通訊聲明:本文標題《Python實現(xiàn)單例模式的5種方法》,本文關鍵詞  ;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    嘉禾县| 尉犁县| 安化县| 景洪市| 桦甸市| 铁岭县| 灵寿县| 小金县| 宁乡县| 微博| 晋州市| 桓台县| 左云县| 游戏| 芒康县| 峡江县| 拉萨市| 福建省| 恩平市| 泸水县| 林西县| 罗山县| 罗江县| 泾阳县| 佛学| 清水河县| 沂水县| 沭阳县| 龙泉市| 营口市| 阿拉善左旗| 云龙县| 措美县| 纳雍县| 沾益县| 如皋市| 贵德县| 商水县| 黄大仙区| 阜南县| 华安县|