шаблон синглтона с __new__ не работает в Python 2 - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь реализовать шаблон синглтона в Python 2, но он не работает, но он работает в Python 3, кто-нибудь, помогите мне объяснить, почему?

class Singleton:

    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

obj1 = Singleton()
obj2 = Singleton()

print(obj1)
print(obj2)

вывод:

<__main__.Singleton instance at 0x7fab8b625e60>
<__main__.Singleton instance at 0x7fab8b5e4710>

1 Ответ

1 голос
/ 11 июля 2019

Прежде всего в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...