期望实现单例, 保持某个属性全局唯一
仿照经典实现代码, 却出现了不是单例的情况
实现scheduler全局唯一, 不派生过多的scheduler
拷贝代码
运行之
查看内存地址
仿照经典实现
from apscheduler.schedulers.background import BackgroundScheduler
class Borg(object):
__shared_state = {}
def __init__(self):
self.__dict__ = Borg.__shared_state
self.scheduler = BackgroundScheduler()
s1 = Borg().scheduler
s2 = Borg().scheduler
print s1, s2
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02623DF0>
# <apscheduler.schedulers.background.BackgroundScheduler object at 0x02D801D0>
我自己想的办法
from apscheduler.schedulers.background import BackgroundScheduler
class Borg(object):
@classmethod
def get_scheduler(cls):
try:
cls_scheduler = cls.scheduler
except AttributeError as e:
cls.scheduler = BackgroundScheduler()
return cls.scheduler
else:
return cls_scheduler
bs1 = 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>
产品版本: Python 2.7 APScheduler最新
操作系统: Linux
Github链接, 经典实现: https://github.com/faif/pytho...
Cet exemple classique ne peut pas être considéré comme un pur singleton, mais comme un
Brog
modèle avec des caractéristiques singleton.La magie réside dans l'utilisation du dictionnaire des attributs de classe
Brog
partagé par la classe__shared_state
, et les instances créées ultérieurement écraseront les__dict__
des instances précédentes.Créez une instance
s1
et initialisez l'attributscheduler
en même temps. L'adresse à ce moment est0x02623DF0
Créez une autre instances2
, puis modifiez l'attributscheduler
et l'adresse est.0x02D801D0
.s1
ets2
sont en fait deux instances différentes, mais leurs attributs partagent des attributs de classe, ce qui ressemble à un singleton.Si vous modifiez le code comme suit, vous devriez pouvoir voir le processus plus clairement :