我正在尝试实现单例,但在导入模块时遇到了困难。我的设置如下。我正在使用Python 2.7。
MODULE 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)
MODULE 2
import SingletonClass
class AnotherClass:
print SingletonClass.SingletonClass() #OUTPUT: 0x0000000003292208
在模块内,单例正在工作,但在另一个模块中,单例没有返回与第一个模块中相同的对象。知道为什么吗?
Edit
现在我将放置我发现的唯一有效的东西。我确信对此有更好的解决方案,但我认为这可以更好地传达根本问题是什么。
MODULE 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
MODULE 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
MODULE 3
import SingletonClass
class AnotherClass:
print SingletonClass.SingletonClass() #OUTPUT: 0x00000000030F1630
解决方案(编辑3)
教训:不要将 main 函数与 Singleton 放在同一个模块中!