Singleton TypeError: object () не принимает параметров - PullRequest
0 голосов
/ 03 июля 2018

Я столкнулся с этой проблемой, когда использовал метод __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 вообще не решает эту проблему.

Я не знаю причину, я надеюсь, что кто-то может помочь мне решить ее. спасибо

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