我正在尝试实现Singleton,并且在导入模块时遇到了困难。我的设置如下。我使用的是Python 2.7。
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)
import SingletonClass
class AnotherClass:
print SingletonClass.SingletonClass() #OUTPUT: 0x0000000003292208
在模块中单例正在工作,但在另一个模块中,Singleton没有返回与第一个相同的对象。知道为什么吗?
现在我将把我发现的唯一有效的东西放进去。我确信有更好的解决方案,但我认为这可能更好地传达了潜在的问题。
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
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
import SingletonClass
class AnotherClass:
print SingletonClass.SingletonClass() #OUTPUT: 0x00000000030F1630
课程:不要让你的主要功能与你的单身人士在同一个模块中!
答案 0 :(得分:2)
您的问题很可能是在两个不同的名称下导入模块两次。
要测试此项,请添加以下内容:
print "Being imported..."
在module1.py
。
如果此消息打印两次,则导入模块两次,这就是您的问题。要解决此问题,请确保使用相同的名称将模块导入到任何地方[0],并且您没有使用sys.path
执行hackery。
[0]:从技术上讲,这不是必要的,但这是一个简单的解决方法。