Я столкнулся с этой проблемой, когда использовал метод __new__
в качестве одиночного:
In [1]: class Singleton(object):
...: __instances = None
...:
...: def __new__(cls, *args, **kwargs):
...: if not cls.__instances:
...: cls.__instances = super(Singleton, cls).__new__(cls, *args, **kwargs)
...: return cls.__instances
...:
...: def __init__(self, first_name=None):
...: self.name = first_name or 'default'
...:
...: def __repr__(self):
...: return '{}:{}'.format(self.__class__.__name__, id(self.__instances))
...:
In [2]:
In [2]: Singleton()
Out[2]: Singleton:2267245738528
In [3]: Singleton('Tom')
Out[3]: Singleton:2267245738528
Это нормально при создании.
Это нормально при создании. Но если я хочу передать параметр при первой его инициализации, я получаю сообщение об ошибке
In [1]: class Singleton(object):
...: __instances = None
...:
...: def __new__(cls, *args, **kwargs):
...: if not cls.__instances:
...: cls.__instances = super(Singleton, cls).__new__(cls, *args, **kwargs)
...: return cls.__instances
...:
...: def __init__(self, first_name=None):
...: self.name = first_name or 'default'
...:
...: def __repr__(self):
...: return '{}:{}'.format(self.__class__.__name__, id(self.__instances))
...:
In [2]: Singleton('Tom')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-2-0f57d3c599ef> in <module>()
----> 1 Singleton('Tom')
<ipython-input-1-ae17d23d4fbe> in __new__(cls, *args, **kwargs)
4 def __new__(cls, *args, **kwargs):
5 if not cls.__instances:
----> 6 cls.__instances = super(Singleton, cls).__new__(cls, *args, **kwargs)
7 return cls.__instances
8
TypeError: object() takes no parameters
In [3]: Singleton()
Out[3]: Singleton:2013693188024
In [4]: Singleton('Tom')
Out[4]: Singleton:2013693188024
In [5]: Singleton('Jim')
Out[5]: Singleton:2013693188024
Это нормально при создании. Но если я хочу передать параметр при первой его инициализации, я получаю сообщение об ошибке. Если вы продолжаете использовать объекты инициализации без параметров, это нормально и может быть использовано позже.
Это может показаться приемлемым вариантом, но в реальном коде программа завершается из-за исключения. Попробуйте -catch вообще не решает эту проблему.
Я не знаю причину, я надеюсь, что кто-то может помочь мне решить ее. спасибо