当我使用__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根本解决不了这个问题。
我不知道原因,希望有人能帮助我解决问题。谢谢