recherche

Maison  >  Questions et réponses  >  le corps du texte

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>

上下文环境

巴扎黑巴扎黑2786 Il y a quelques jours597

répondre à tous(1)je répondrai

  • PHP中文网

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

    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.

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

    Créez une instance s1 et initialisez l'attribut scheduler en même temps. L'adresse à ce moment est 0x02623DF0 Créez une autre instance s2, puis modifiez l'attribut scheduler et l'adresse est. 0x02D801D0. s1 et s2 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 :

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

    répondre
    0
  • Annulerrépondre