国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

Python中, 仿照經(jīng)典代碼實(shí)現(xiàn)單例, 卻出現(xiàn)了不是單例的的狀態(tài), 代碼哪里出錯(cuò)了 ?

瀏覽:110日期:2022-09-02 16:42:21

問題描述

實(shí)際現(xiàn)象

期望實(shí)現(xiàn)單例, 保持某個(gè)屬性全局唯一

預(yù)期現(xiàn)象

仿照經(jīng)典實(shí)現(xiàn)代碼, 卻出現(xiàn)了不是單例的情況

我要做什么

實(shí)現(xiàn)scheduler全局唯一, 不派生過多的scheduler

重現(xiàn)步驟

拷貝代碼

運(yùn)行之

查看內(nèi)存地址

相關(guān)代碼

仿照經(jīng)典實(shí)現(xiàn)

from apscheduler.schedulers.background import BackgroundSchedulerclass Borg(object):__shared_state = {} def __init__(self):self.__dict__ = Borg.__shared_stateself.scheduler = BackgroundScheduler()s1 = Borg().schedulers2 = Borg().schedulerprint s1, s2# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02623DF0> # <apscheduler.schedulers.background.BackgroundScheduler object at 0x02D801D0>

我自己想的辦法

from apscheduler.schedulers.background import BackgroundSchedulerclass Borg(object): @classmethod def get_scheduler(cls):try: cls_scheduler = cls.schedulerexcept AttributeError as e: cls.scheduler = BackgroundScheduler() return cls.schedulerelse: return cls_schedulerbs1 = Borg.get_scheduler()bs2 = Borg.get_scheduler()bs3 = Borg.get_scheduler()print bs1, bs2, bs3# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70> # <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70> # <apscheduler.schedulers.background.BackgroundScheduler object at 0x02752D70>上下文環(huán)境

產(chǎn)品版本: Python 2.7 APScheduler最新

操作系統(tǒng): Linux

Github鏈接, 經(jīng)典實(shí)現(xiàn): https://github.com/faif/pytho...

問題解答

回答1:

經(jīng)典例子這個(gè)不能算是純單例,而是具有單例特性的Brog模式。

其魔法在于利用類Brog共享的類屬性__shared_state的字典,后面創(chuàng)建的實(shí)例會(huì)覆蓋前面實(shí)例的__dict__。

s1 = Borg().schedulers2 = Borg().scheduler

創(chuàng)建一個(gè)實(shí)例s1,同時(shí)初始化屬性scheduler,此時(shí)的地址是0x02623DF0,再創(chuàng)建一個(gè)實(shí)例s2,然后修改了屬性scheduler,地址為0x02D801D0。s1和s2其實(shí)是兩個(gè)不同實(shí)例,只不過他們的屬性共用類屬性,看起來就像單例的效果。

如果把代碼改成這樣,應(yīng)該就能看得更清楚過程:

s1 = Borg()print(s1.scheduler)s2 = Borg()print(s1.scheduler)print(s2.scheduler)print(s1.scheduler is s2.scheduler)

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 91香蕉视频成人 | 成人三级毛片 | 日韩视频欧美视频 | 一级片成人 | 99爱免费观看视频在线 | 久久精品亚洲一区二区 | 日韩欧美一区二区中文字幕 | 女人a级毛片 | 精品国产亚一区二区三区 | 精品国产一区二区三区在线观看 | 在线亚洲精品自拍 | www欧美com | 国产精品久久久久久久hd | 国产毛片a精品毛 | 毛片在线免费观看网站 | 成人免费看片 | 九九99九九视频在线观看 | 欧美极品大肚孕妇孕交 | 国模午夜写真福利视频在线 | 欧美性狂猛bbbbbbxxxxxx | 亚洲一区二区在线成人 | 国产成人精品自拍 | 91日本在线视频 | 99国产成人高清在线视频 | 一级美女黄色片 | 国产亚洲精品高清在线 | 最新国产午夜精品视频成人 | 日韩永久在线观看免费视频 | 美国免费高清一级毛片 | 色黄啪啪18周岁以下禁止观看 | 古代级a毛片可以免费看 | 日韩中文字幕在线免费观看 | 国产a级高清版毛片 | 精品乱人伦一区二区 | 综合自拍亚洲综合图区美腿丝袜 | 美国一级毛片片aa成人 | 国产精品视频久久久久久 | 亚洲精品不卡在线 | 亚洲综合久久综合激情久久 | 欧美国产亚洲一区 | 91久久精品国产一区二区 |