期望实现单例, 保持某个属性全局唯一
仿照经典实现代码, 却出现了不是单例的情况
实现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...
PHP中文网2017-04-18 10:26:53
古典的な例は純粋なシングルトンではなく、シングルトンの特性を持つ Brog
パターンです。 Brog
模式。
其魔法在于利用类Brog
共享的类属性__shared_state
的字典,后面创建的实例会覆盖前面实例的__dict__
。
s1 = Borg().scheduler
s2 = Borg().scheduler
创建一个实例s1
,同时初始化属性scheduler
,此时的地址是0x02623DF0
,再创建一个实例s2
,然后修改了属性scheduler
,地址为0x02D801D0
。s1
和s2
Brog
によって共有されるクラス属性 __shared_state
の辞書を使用することにあります。後で作成されたインスタンスは、前のインスタンスの __dict__
を上書きします。実例。 リーリー
インスタンスs1
を作成し、属性 scheduler
を初期化します。このときのアドレスは 0x02623DF0
で、インスタンス s2< を作成します。 /code> > を変更し、属性 scheduler
を変更します。アドレスは 0x02D801D0
です。 s1
と s2
は実際には 2 つの異なるインスタンスですが、それらの属性はクラス属性を共有しており、シングルトンのように見えます。 🎜
🎜コードを次のように変更すると、プロセスをより明確に確認できるようになります: 🎜
リーリー返事0