Python中, 仿照經(jīng)典代碼實(shí)現(xiàn)單例, 卻出現(xiàn)了不是單例的的狀態(tài), 代碼哪里出錯(cuò)了 ?
問(wèn)題描述
實(shí)際現(xiàn)象期望實(shí)現(xiàn)單例, 保持某個(gè)屬性全局唯一
預(yù)期現(xiàn)象仿照經(jīng)典實(shí)現(xiàn)代碼, 卻出現(xiàn)了不是單例的情況
我要做什么實(shí)現(xiàn)scheduler全局唯一, 不派生過(guò)多的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...
問(wèn)題解答
回答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í)例,只不過(guò)他們的屬性共用類屬性,看起來(lái)就像單例的效果。
如果把代碼改成這樣,應(yīng)該就能看得更清楚過(guò)程:
s1 = Borg()print(s1.scheduler)s2 = Borg()print(s1.scheduler)print(s2.scheduler)print(s1.scheduler is s2.scheduler)
相關(guān)文章:
1. python中遍歷列表的合并問(wèn)題2. python中def定義的函數(shù)加括號(hào)和不加括號(hào)的區(qū)別?3. python中列表內(nèi)能否套字典?4. python中如何計(jì)算t分布的值?5. 用python中的xpath怎么獲取我想要標(biāo)記的內(nèi)容6. c - 為什么python中值相等的兩個(gè)變量會(huì)指向同一個(gè)內(nèi)存地址?7. 請(qǐng)問(wèn)python中為什么我用for循環(huán)對(duì)嵌套列表進(jìn)行賦值時(shí),都是以i的最終值來(lái)計(jì)算的?8. md5 - python中如何校驗(yàn)本地目錄和遠(yuǎn)程目錄?9. python中split如何優(yōu)先使用10. pygame - python中響應(yīng)同一事件第二次的時(shí)候執(zhí)行不同操作
