【发布时间】:2012-06-11 17:21:17
【问题描述】:
我正在尝试实现单例,但在导入模块时遇到了困难。我的设置如下。我正在使用 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 放在同一个模块中!
【问题讨论】:
-
Python singleton pattern 的可能重复项
-
你所拥有的不可能工作,我的意思是你会在第二个模块中的
import或SingletonClass()收到错误。另外,为什么print声明在类定义中?这段代码没有任何意义。 -
@kindall 这是伪代码。这大致是我所拥有的,但我试图简化一些事情以提高可读性。
-
那么……您发布的代码有效:
<a.SingletonClass object at 0x10bef8e10> <a.SingletonClass object at 0x10bef8e10> <a.SingletonClass object at 0x10bef8e10>— 您能发布一些代码来证明您的问题吗? -
@DavidWolever 我认为问题在于我组织模块的方式。我现在拥有它的方式每个模块都有自己的对象版本。我不确定为什么你会得到不同的结果。我应该指出我使用的是 Python 2.7。此外,当我创建一个名为 SingletonParent 的新模块和类并让 SingletonClass 成为它的唯一导入器时,一切正常。如果可能的话,我宁愿避免这种实现。
标签: python design-patterns singleton