为什么我的单例实现在 Python 中不起作用?
Why does my singleton implementation not work in Python?
下面是尝试在 python3 中实现 Singleton,但它似乎不起作用。当我实例化时,_instance
总是 None
并且两个实例(a
和 b
)在内存中有不同的地址 - 为什么?
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>
下面是尝试在 python3 中实现 Singleton,但它似乎不起作用。当我实例化时,_instance
总是 None
并且两个实例(a
和 b
)在内存中有不同的地址 - 为什么?
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>