溫馨提示×

溫馨提示×

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

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

python單例模式是什么

發(fā)布時(shí)間:2020-09-24 14:51:36 來源:億速云 閱讀:83 作者:Leah 欄目:編程語言

python單例模式是什么?很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

單例模式

單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)類只有一個(gè)實(shí)例存在。當(dāng)你希望在整個(gè)系統(tǒng)中,某個(gè)類只能出現(xiàn)一個(gè)實(shí)例時(shí),單例對象就能派上用場。

比如,某個(gè)服務(wù)器程序的配置信息存放在一個(gè)文件中,客戶端通過一個(gè) AppConfig 的類來讀取配置文件的信息。如果在程序運(yùn)行期間,有很多地方都需要使用配置文件的內(nèi)容,也就是說,很多地方都需要?jiǎng)?chuàng)建 AppConfig 對象的實(shí)例,這就導(dǎo)致系統(tǒng)中存在多個(gè) AppConfig 的實(shí)例對象,而這樣會嚴(yán)重浪費(fèi)內(nèi)存資源,尤其是在配置文件內(nèi)容很多的情況下。事實(shí)上,類似 AppConfig 這樣的類,我們希望在程序運(yùn)行期間只存在一個(gè)實(shí)例對象。

單例模式的要點(diǎn)有三個(gè);一是某個(gè)類只能有一個(gè)實(shí)例;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

在 Python 中,我們可以用多種方法來實(shí)現(xiàn)單例模式:

使用模塊

使用 __new__

使用裝飾器(decorator)

使用元類(metaclass)

使用模塊

其實(shí),Python 的模塊就是天然的單例模式。

因?yàn)槟K在第一次導(dǎo)入時(shí),會生成 .pyc 文件,當(dāng)?shù)诙螌?dǎo)入時(shí),就會直接加載 .pyc 文件,而不會再次執(zhí)行模塊代碼。因此,我們只需把相關(guān)的函數(shù)和數(shù)據(jù)定義在一個(gè)模塊中,就可以獲得一個(gè)單例對象了。

如果我們真的想要一個(gè)單例類,可以考慮這樣做:

#tests1.py
class MyClass(object):
    def foo(self):
        print('MyClass.foo')
my_class_obj=MyClass()

將上面的代碼保存在文件 tests1.py 中,然后這樣使用:

from .tests1 import my_class_obj
my_class_obj.foo()

使用 __new__

為了使類只能出現(xiàn)一個(gè)實(shí)例,我們可以使用 __new__ 來控制實(shí)例的創(chuàng)建過程,代碼如下:

class MyClass(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(MyClass, cls).__new__(cls, *args, **kwargs)
        return cls._instance

 在上面的代碼中,我們將類的實(shí)例和一個(gè)類變量 _instance 關(guān)聯(lián)起來,如果 cls._instance 為 None 則創(chuàng)建實(shí)例,否則直接返回 cls._instance。

執(zhí)行情況如下:

one = HerClass()
two = HerClass()
print(one == two)   #True
print(one is two)   #True
print(id(one), id(two)) #42818864 42818864

看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注億速云行業(yè)資訊頻道,感謝您對億速云的支持。

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

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

AI