我试图实现一个Singleton,当我导入模块时遇到了困难。我的设置如下。我使用的是python2.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)
在模块中,singleton正在工作,但在另一个模块中,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
教训:不要把你的主函数和你的单例函数放在同一个模块中!在
您的问题很可能是模块以两个不同的名称导入了两次。在
要对此进行测试,请添加以下内容:
在
module1.py
中。在如果这个模块被导入两次,那么这个模块就被打印了两次。要修复它,请确保您使用相同的名称在任何地方导入模块[0],并且您没有使用
sys.path
进行黑客攻击。在[0]:从技术上讲,这是不必要的,但这是一个简单的修复。在
相关问题 更多 >
编程相关推荐