欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年06月15日 09:37:29   作者:云崖先生  
單例模式應(yīng)該是應(yīng)用最廣泛,實(shí)現(xiàn)最簡(jiǎn)單的一種創(chuàng)建型模式。本文詳細(xì)的介紹了Python實(shí)現(xiàn)單例模式的5種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

基本介紹

一個(gè)對(duì)象只允許被一次創(chuàng)建,一個(gè)類只能創(chuàng)建一個(gè)對(duì)象,并且提供一個(gè)全局訪問(wèn)點(diǎn)。

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

特點(diǎn):全局唯一,允許更改

優(yōu)缺點(diǎn)

優(yōu)點(diǎn):

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

缺點(diǎn):

  • 沒有接口,不能繼承,與單一職責(zé)原則沖突,一個(gè)類應(yīng)該只關(guān)心內(nèi)部邏輯,而不關(guān)心外面怎么樣來(lái)實(shí)例化

Python實(shí)現(xiàn)

方式1,元類實(shí)現(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,繼承實(shí)現(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,裝飾器實(shí)現(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,模塊實(shí)現(xiàn):

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

方式5,@classmethod實(shí)現(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))

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

相關(guān)文章

  • Python中實(shí)現(xiàn)WebSocket的示例詳解

    Python中實(shí)現(xiàn)WebSocket的示例詳解

    WebSocket 是一種計(jì)算機(jī)通信協(xié)議,它為客戶端和服務(wù)器之間的雙向通信提供了一個(gè)全雙工的通道,本篇文章將詳解 Python 中如何實(shí)現(xiàn) WebSocket,感興趣的可以了解下
    2025-03-03
  • Python格式化輸出字符串的五種方法總結(jié)

    Python格式化輸出字符串的五種方法總結(jié)

    Python語(yǔ)言有許多優(yōu)點(diǎn),常用于不同的領(lǐng)域,如數(shù)據(jù)科學(xué)、web開發(fā)、自動(dòng)化運(yùn)維等。本文將學(xué)習(xí)如何使用字符串中內(nèi)置的方法來(lái)格式化字符串,感興趣的可以了解一下
    2022-06-06
  • python實(shí)戰(zhàn)游戲之史上最難最虐的掃雷游戲沒有之一

    python實(shí)戰(zhàn)游戲之史上最難最虐的掃雷游戲沒有之一

    這篇文章主要介紹了使用 python 實(shí)現(xiàn)掃雷游戲,不同于傳統(tǒng)過(guò)時(shí)的掃雷,今天我們用 Python 增加了新花樣,文中給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09
  • Python在PDF中添加或刪除超鏈接的操作

    Python在PDF中添加或刪除超鏈接的操作

    PDF文件現(xiàn)已成為文檔存儲(chǔ)和分發(fā)的首選格式,然而,PDF文件的靜態(tài)特性有時(shí)會(huì)限制其交互性,超鏈接是提高PDF文件互動(dòng)性和用戶體驗(yàn)的關(guān)鍵元素,本文將詳細(xì)介紹如何使用第三方庫(kù)Spire.PDF for Python來(lái)進(jìn)行這些操作,需要的朋友可以參考下
    2024-12-12
  • Python實(shí)現(xiàn)拷貝多個(gè)文件到同一目錄的方法

    Python實(shí)現(xiàn)拷貝多個(gè)文件到同一目錄的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)拷貝多個(gè)文件到同一目錄的方法,涉及Python針對(duì)文件與目錄的遍歷、復(fù)制等相關(guān)操作技巧,需要的朋友可以參考下
    2016-09-09
  • 詳解Python圖像處理中內(nèi)存泄漏的問(wèn)題解決方法

    詳解Python圖像處理中內(nèi)存泄漏的問(wèn)題解決方法

    在Python編程中,尤其是在圖像處理領(lǐng)域,內(nèi)存泄漏是一個(gè)不容忽視的問(wèn)題,本文將深入探討Python為何容易發(fā)生內(nèi)存泄漏,以及如何有效檢測(cè)和解決,希望對(duì)大家有所幫助
    2025-02-02
  • pandas DataFrame 交集并集補(bǔ)集的實(shí)現(xiàn)

    pandas DataFrame 交集并集補(bǔ)集的實(shí)現(xiàn)

    這篇文章主要介紹了pandas DataFrame 交集并集補(bǔ)集的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 在Python中進(jìn)行CSV文件的讀取與寫入操作

    在Python中進(jìn)行CSV文件的讀取與寫入操作

    本文詳細(xì)介紹了如何在Python中使用csv模塊進(jìn)行CSV文件的讀取和寫入,包括基本用法和高級(jí)功能,如DictWriter和DictReader,以及注意事項(xiàng),需要的朋友可以參考下
    2025-03-03
  • pytorch 禁止/允許計(jì)算局部梯度的操作

    pytorch 禁止/允許計(jì)算局部梯度的操作

    這篇文章主要介紹了pytorch 禁止/允許計(jì)算局部梯度的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Python練習(xí)之操作MySQL數(shù)據(jù)庫(kù)

    Python練習(xí)之操作MySQL數(shù)據(jù)庫(kù)

    這篇文章主要介紹了Python練習(xí)之操作MySQL數(shù)據(jù)庫(kù),文章通過(guò)如何創(chuàng)建MySQL數(shù)據(jù)表?如何向MySQL表中插入數(shù)據(jù)?如何查詢MySQL中的數(shù)據(jù)?的三個(gè)問(wèn)題展開了詳細(xì)的內(nèi)容介紹
    2022-06-06

最新評(píng)論