python 單例模式

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

比如窒盐,某個(gè)服務(wù)器程序的配置信息存放在一個(gè)文件中,客戶端通過(guò)一個(gè) AppConfig 的類來(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í)上,類似 AppConfig 這樣的類呻此,我們希望在程序運(yùn)行期間只存在一個(gè)實(shí)例對(duì)象轮纫。

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

"""
1.類由type創(chuàng)建焚鲜,創(chuàng)建類時(shí)掌唾,type的__init__方法自動(dòng)執(zhí)行,類() 執(zhí)行type的 __call__方法(類的__new__方法,類的__init__方法)
2.對(duì)象由類創(chuàng)建忿磅,創(chuàng)建對(duì)象時(shí)糯彬,類的__init__方法自動(dòng)執(zhí)行,對(duì)象()執(zhí)行類的 __call__ 方法
"""
class Singleton(type):
    """Singleton Metaclass"""

    def __init__(self, name, bases, dic):
        super(Singleton, self).__init__(name, bases, dic)
        self.instance = None

    def __call__(self, *args, **kwargs):
        print(self.instance)
        if self.instance is None:
            self.instance = super(Singleton, self).__call__(*args, **kwargs)
        return self.instance

class test(metaclass=Singleton): # 指定創(chuàng)建Foo的type為SingletonType
    def __init__(self):
        self.json_config = None


print(test().json_config)
test().json_config = {"a":1}
print(test().json_config)
print(test())
print(test())

"""
輸出結(jié)果

None
{'a': 1}
<__main__.test object at 0x000001B114A76FD0>
<__main__.test object at 0x000001B114A76FD0>

由此可以看出來(lái)葱她,雖然test實(shí)例化了4次
但是每一次都是同一個(gè)實(shí)例撩扒。
"""
'''
實(shí)現(xiàn)帶線程安全鎖的單例
'''
import threading

class SingletonType(type):
    _instance_lock = threading.Lock()
    def __call__(cls, *args, **kwargs):
        if not hasattr(cls, "_instance"):
            with SingletonType._instance_lock:
                if not hasattr(cls, "_instance"):
                    cls._instance = super(SingletonType,cls).__call__(*args, **kwargs)
        return cls._instance

class Foo(metaclass=SingletonType):
    def __init__(self,name):
        self.name = name


obj1 = Foo('name')
obj2 = Foo('name')
print(obj1,obj2)
'''
可以看到在兩者區(qū)別是在call魔術(shù)方法內(nèi)
后者增加了線程鎖
'''
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市吨些,隨后出現(xiàn)的幾起案子搓谆,更是在濱河造成了極大的恐慌,老刑警劉巖豪墅,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泉手,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡偶器,警方通過(guò)查閱死者的電腦和手機(jī)斩萌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門缝裤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颊郎,你說(shuō)我怎么就攤上這事憋飞。” “怎么了袭艺?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵搀崭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我猾编,道長(zhǎng)瘤睹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任答倡,我火速辦了婚禮轰传,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘪撇。我一直安慰自己获茬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布倔既。 她就那樣靜靜地躺著恕曲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪渤涌。 梳的紋絲不亂的頭發(fā)上佩谣,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音实蓬,去河邊找鬼茸俭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛安皱,可吹牛的內(nèi)容都是我干的调鬓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼酌伊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腾窝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起居砖,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤燕锥,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悯蝉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡托慨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鼻由,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蕉世,死狀恐怖蔼紧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狠轻,我是刑警寧澤奸例,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站向楼,受9級(jí)特大地震影響查吊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜湖蜕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一逻卖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧昭抒,春花似錦评也、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至熙含,卻和暖如春罚缕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婆芦。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工怕磨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人消约。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓肠鲫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親或粮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子导饲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,它用來(lái)確保一個(gè)類只有一個(gè)實(shí)例氯材,并提供一個(gè)全...
    四明羽客閱讀 887評(píng)論 1 3
  • 相關(guān)代碼已經(jīng)上傳至Github:Python_Development_Interview,大家可以收藏專題-Pyt...
    云爬蟲技術(shù)研究筆記閱讀 2,283評(píng)論 0 6
  • 單例模式 單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式氢哮,該模式的主要目的是確保某一個(gè)類只...
    星丶雲(yún)閱讀 275評(píng)論 0 2
  • 單例模式(Singleton Pattern) 是一種常用的軟件設(shè)計(jì)模式袋毙,該模式的主要目的是確保某一個(gè)類只有一個(gè)實(shí)...
    莫名ypc閱讀 261評(píng)論 0 1
  • 概述 單例模式(Singleton Pattern)是一種常用的軟件設(shè)計(jì)模式,該模式的主要目的是確保某一個(gè)類只有一...
    Oriharas閱讀 374評(píng)論 0 0