溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python實(shí)現(xiàn)單例的方法有哪些

發(fā)布時(shí)間:2023-03-02 10:08:57 來(lái)源:億速云 閱讀:120 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“python實(shí)現(xiàn)單例的方法有哪些”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“python實(shí)現(xiàn)單例的方法有哪些”文章吧。

    python 實(shí)現(xiàn)單例的方法

    第一種方法:使用基類(lèi)

    New 是真正創(chuàng)建實(shí)例對(duì)象的方法,所以重寫(xiě)基類(lèi)的new 方法,以此保證創(chuàng)建對(duì)象的時(shí)候只生成一個(gè)實(shí)例

    class Singleton(object):
        def __new__(cls, *args, **kwargs):
            # hasattr 判斷是否有...屬性
            if not hasattr(cls, '_instance'):
                cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
            return cls._instance
    
    
    class Foo(Singleton):
        pass
    
    foo1 = Foo()
    foo2 = Foo()
    
    print(foo1 is foo2)

    第二種方法:使用裝飾器

    def Singleton(cls):
        instance = {}
        def wrapper(*args, **kwargs):
            if cls not in instance:
                instance[cls] = cls(*args, **kwargs)
            return instance[cls]
        return wrapper
    
    @Singleton
    class Foo(object):
        pass
    
    foo1 = Foo()
    foo2 = Foo()
    print(foo1 is foo2)

    python 單例對(duì)象

    單列模式

    單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某 一個(gè)類(lèi)只有一個(gè)實(shí)例存在。

    當(dāng)你希望在整個(gè)系統(tǒng)中,某個(gè)類(lèi)只能出現(xiàn)一個(gè)實(shí)例時(shí),單例對(duì)象 就能派上用場(chǎng)。

    比如,某個(gè)服務(wù)器程序的配置信息存放在一個(gè)文件中,客戶端通過(guò)一個(gè) AppConfig 的類(lèi)來(lái) 讀取配置文件的信息。

    如果在程序運(yùn)行期間,有很多地方都需要使用配置文件的內(nèi)容,也就 是說(shuō),很多地方都需要?jiǎng)?chuàng)建 AppConfig 對(duì)象的實(shí)例,這就導(dǎo)致系統(tǒng)中存在多個(gè) AppConfig 的實(shí)例對(duì)象,而這樣會(huì)嚴(yán)重浪費(fèi)內(nèi)存資源,尤其是在配置文件內(nèi)容很多的情況 下。

    事實(shí)上,類(lèi)似 AppConfig 這樣的類(lèi),我們希望在程序運(yùn)行期間只存在一個(gè)實(shí)例對(duì)象。 注意:在python中導(dǎo)入模塊就是一種單例模式

    簡(jiǎn)單來(lái)說(shuō)單列模式就是創(chuàng)建單列對(duì)象,重寫(xiě)object類(lèi)里面的__new__方法使之開(kāi)辟一個(gè)內(nèi)存空間,所有對(duì)象都指向同一內(nèi)存空間,使多個(gè)對(duì)象的引用地址相同

    class Dog (object):
        __instance=None
        def __new__(cls, *args, **kwargs):
            if cls.__instance==None:
                cls.__instance=object.__new__(cls)
                return cls.__instance
            else:
                return cls.__instance
    dog=Dog()
    dog1=Dog()
    print(id(dog))
    print(id(dog1))

    運(yùn)行結(jié)果:

    python實(shí)現(xiàn)單例的方法有哪些

    你會(huì)發(fā)現(xiàn)兩個(gè)對(duì)象的id一樣 這也就說(shuō)明兩個(gè)對(duì)象指向的內(nèi)存地址就一樣,這個(gè)就是單例對(duì)象

    以上就是關(guān)于“python實(shí)現(xiàn)單例的方法有哪些”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI