期望实现单例, 保持某个属性全局唯一
仿照经典实现代码, 却出现了不是单例的情况
实现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...
Contoh klasik ini tidak boleh dianggap sebagai singleton tulen, tetapi corak
Brog
dengan ciri tunggal.Keajaibannya terletak pada penggunaan kamus atribut kelas
Brog
yang dikongsi oleh kelas__shared_state
dan tika yang dibuat kemudian akan menimpa__dict__
kejadian sebelumnya.Buat contoh
s1
dan mulakan atributscheduler
pada masa yang sama Alamat pada masa ini ialah0x02623DF0
Buat contoh lains2
, dan kemudian ubah suai atributscheduler
dan alamatnya0x02D801D0
.s1
dans2
sebenarnya adalah dua kejadian berbeza, tetapi atribut mereka berkongsi atribut kelas, yang kelihatan seperti singleton.Jika anda menukar kod ini, anda sepatutnya dapat melihat prosesnya dengan lebih jelas: