ホームページ  >  に質問  >  本文

Python中, 仿照经典代码实现单例, 却出现了不是单例的的状态, 代码哪里出错了 ?

实际现象

预期现象

我要做什么

重现步骤

  1. 拷贝代码

  2. 运行之

  3. 查看内存地址

相关代码

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>

上下文环境

巴扎黑巴扎黑2717日前541

全員に返信(1)返信します

  • PHP中文网

    PHP中文网2017-04-18 10:26:53

    古典的な例は純粋なシングルトンではなく、シングルトンの特性を持つ Brog パターンです。 Brog模式。

    其魔法在于利用类Brog共享的类属性__shared_state的字典,后面创建的实例会覆盖前面实例的__dict__

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

    创建一个实例s1,同时初始化属性scheduler,此时的地址是0x02623DF0,再创建一个实例s2,然后修改了属性scheduler,地址为0x02D801D0s1s2

    魔法は、クラス Brog によって共有されるクラス属性 __shared_state の辞書を使用することにあります。後で作成されたインスタンスは、前のインスタンスの __dict__ を上書きします。実例。

    リーリー

    インスタンス s1 を作成し、属性 scheduler を初期化します。このときのアドレスは 0x02623DF0 で、インスタンス s2< を作成します。 /code> > を変更し、属性 scheduler を変更します。アドレスは 0x02D801D0 です。 s1s2 は実際には 2 つの異なるインスタンスですが、それらの属性はクラス属性を共有しており、シングルトンのように見えます。 🎜 🎜コードを次のように変更すると、プロセスをより明確に確認できるようになります: 🎜 リーリー

    返事
    0
  • キャンセル返事