<p>这无法工作,因为<code>__init__</code>方法是在对象创建之后通过<code>__new__</code>调用的。从<a href="https://docs.python.org/3/reference/datamodel.html#special-method-names" rel="nofollow">Python Language Reference</a>提取</p>
<blockquote>
<p>If <code>__new__()</code> returns an instance of cls, then the new instance’s <code>__init__()</code> method will be invoked like <code>__init__(self[, ...])</code>, where <code>self</code> is the new instance and the remaining arguments are the same as were passed to <code>__new__()</code>.</p>
</blockquote>
<p>您应该有一个与<code>__init__</code>不同的特殊初始化方法,并在<code>_instance</code>创建时调用。在</p>
<p>代码可以是(不需要父类,所以我省略了它):</p>
<pre><code>class SingletonA:
_instance = None
def __init__(self):
# some state
print("Creating dummy state in SingletonA")
def _init(self):
# some state
print("Creating state in SingletonA")
self.X = 1.
self.Y = 2.
def __new__(cls, *args, **kwargs):
if cls._instance is None:
cls._instance = super(SingletonA, cls).__new__(
cls, *args, **kwargs)
cls._instance._init()
return cls._instance
</code></pre>
<p>但实际上,您只需在声明时构建实例:</p>
^{pr2}$
<p>这两种方式都会导致以下输出(对于单件零件):</p>
<pre><code>Creating state in A
Creating dummy state in SingletonA
Creating dummy state in SingletonA
('Same', 1.0, 2.0)
</code></pre>
<p>完全删除<code>__init__</code>方法将导致一次初始化。在</p>
<p>注释版本可以是:</p>
<pre><code>class ClassB:
def __init__(self):
# some state
print("Creating state in B")
self.X = 1.
self.Y = 2.
def singleton(cls):
obj = cls()
# Always return the same object
cls._instance = obj
cls.__new__ = staticmethod(lambda cls: cls._instance)
# Disable __init__
cls.__init__ = (lambda self: None)
return cls
@singleton
class SingletonB(ClassB):
pass
</code></pre>
<p>简单地将单例实例存储在类本身中</p>