Singleton TypeError:object()不带参数

时间:2018-07-03 10:06:23

标签: python singleton

当我使用__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根本解决不了这个问题。

我不知道原因,希望有人能帮助我解决问题。谢谢

0 个答案:

没有答案