为什么我的单例实现在 Python 中不起作用?

Why does my singleton implementation not work in Python?

下面是尝试在 python3 中实现 Singleton,但它似乎不起作用。当我实例化时,_instance 总是 None 并且两个实例(ab)在内存中有不同的地址 - 为什么?

class Singleton(object):
    _instance = None

    def __call__(self, *args, **kwargs):
        if self._instance is None:
            self._instance = super().__call__(*args, **kwargs)
        return self._instance

    def __init__(self, *args, **kwargs):
        print(self._instance, self)


a = Singleton()
b = Singleton()

输出为:

(None, <__main__.Singleton object at 0x7f382956c190>)
(None, <__main__.Singleton object at 0x7f382956c410>)

__call__方法不是你想的那样。它旨在使 类 的实例像函数一样可调用:

class A:
    def __call__(self):
        print("called")

a = A() # prints nothing
a() # prints "called"

你要找的是__new__方法:

Called to create a new instance of class cls.

你可以这样写单例(和你写的很相似):

class Singleton(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(Singleton, cls).__new__(cls)
        return cls._instance

    def __init__(self, *args, **kwargs):
        print(self._instance, self)


a = Singleton()
b = Singleton()

现在的输出是:

<__main__.Singleton object at 0x7f149bf3cc88> <__main__.Singleton object at 0x7f149bf3cc88>
<__main__.Singleton object at 0x7f149bf3cc88> <__main__.Singleton object at 0x7f149bf3cc88>