我正在尝试实现单例,但在导入模块时遇到了困难。我的设置如下。我正在使用 Python 2.7。
模块 1
class SingletonClass(object):
def __new__(self, *args, **kwargs):
if not self._instance:
self._instance = super(SingletonClass, self).__new__(
self, *args, **kwargs)
return self._instance
print SingletonClass() #OUTPUT: 0x00000000030F1630
print SingletonClass() #OUTPUT: 0x00000000030F1630 (Good, what I want)
模块 2
import SingletonClass
class AnotherClass:
print SingletonClass.SingletonClass() #OUTPUT: 0x0000000003292208
在模块中单例正在工作,但在另一个模块中,单例没有返回与第一个模块中相同的对象。知道为什么吗?
编辑
现在,我将放置我发现的唯一有效的东西。我确信对此有更好的解决方案,但我认为这可能更好地传达潜在问题是什么。
模块 1
class SingletonParent(object):
_instance = None
def __new__(self, *args, **kwargs):
if not self._instance:
self._instance = super(SingletonParent, self).__new__(
self, *args, **kwargs)
return self._instance
模块 2
import SingletonParent
class SingletonClass(object):
def __new__(self, *args, **kwargs):
if not SingletonParent.SingletonParent._instance:
SingletonParent.SingletonParent._instance = super(SingletonClass, self).__new__(
self, *args, **kwargs)
return SingletonParent.SingletonParent._instance
print SingletonClass() #OUTPUT: 0x00000000030F1630
print SingletonClass() #OUTPUT: 0x00000000030F1630
模块 3
import SingletonClass
class AnotherClass:
print SingletonClass.SingletonClass() #OUTPUT: 0x00000000030F1630
解决方案(编辑 3)
教训:不要把你的 main 函数和你的 Singleton 放在同一个模块中!