Прежде всего в python2 вы должны быть унаследованы от объекта, чтобы сделать __new__
магическими работами.Поскольку класс старого стиля вообще не имеет __new__
метода.
Таким образом, с добавленными отпечатками вы получите:
>>> class Singleton:
... _instance = None
... def __new__(cls):
... print('__new__')
... if cls._instance is None:
... print('create')
... cls._instance = super().__new__(cls)
... return cls._instance
...
>>> obj1 = Singleton()
>>> obj2 = Singleton()
>>>
>>> print(obj1)
<__main__.Singleton instance at 0x7f47dcccecb0>
>>> print(obj2)
<__main__.Singleton instance at 0x7f47dcccef80>
Как видите, python2 не вызывает __new__
совсем.Он просто вызывает пустой __init__
в вашем случае и создает два разных объекта.
Во-вторых, в python2 вам нужно переписать вызов super()
, как это было изменено в python3.Таким образом, исправленный код будет выглядеть так:
>>> class Singleton(object):
... _instance = None
... def __new__(cls):
... print('__new__')
... if cls._instance is None:
... print('create')
... cls._instance = super(Singleton, cls).__new__(cls)
... return cls._instance
...
>>> obj1 = Singleton()
__new__
create
>>> obj2 = Singleton()
__new__
>>>
>>> print(obj1)
<__main__.Singleton object at 0x7f47dccd9590>
>>> print(obj2)
<__main__.Singleton object at 0x7f47dccd9590>
Для получения дополнительной информации о синглетах вы можете прочитать здесь: Создание синглтона в Python