Задать вопрос

Почему копируется синглтон?

Помогите пожалуйста решить проблему. Я пытаюсь использовать синглтон:
class World(object):
  def __new__(cls,*dt,**mp):
      if cls.obj is None:
          cls.obj = object.__new__(cls,*dt,**mp)
      return cls.obj 


  def __init__(self, name, boss):
    self.boss = boss
    self.name = name
    World.quantity += 1

  obj = None

  quantity = 0

  def __str__(self):
    return str(self.__class__.__name__) + ': ' + str(self.__dict__)


Далее создаю 2 объекта:
world1 = World('old', boss='demiurg')
world2 = World('new', boss='mr. bin')


После запуска ожидаю получить один объект с атрибутом dimiurg. Но получаю 2 объекта с атрибутом mr.bin:
kalinin@kalinin ~/python/boats2 $ python index2.py
World: {'name': 'new', 'boss': 'mr. bin'}
World: {'name': 'new', 'boss': 'mr. bin'}
worlds quantity: 2


Непонятно почему:
1. получаются два объекта вместо одного
2. объект имеет атрибут mr.bin, ведь в первую очередь создаётся объект с атрибутом demiurg, а остальные объекты должны быть ссылками на него
  • Вопрос задан
  • 503 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 1
minisotm
@minisotm
python/php developer
Вы меняете свойство name и boss у одного и того же объекта:
>> world1 is world2
True
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
angru
@angru
а вы почитайте в каких случаях вызываются __new__ и __init__ и все станет понятно. вот например. у вас __init__ вызывается два раза на одном и том же обьекте.
Ответ написан
Комментировать
ptitca_zu
@ptitca_zu
Programmer. Reader. Introvert
Или напишите "синглтон для ленивых" :)
from functools import lru_cache

@lru_cache(maxsize=None)
class S: pass
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы