我有两个打印单例实例的文件,但我得到了两个不同的实例。
我正在使用Gary Robinson中的单一代码。
以下是文件:
from singleton import Singleton
import untitled
class A(Singleton):
def __init__(self):
super(A, self).__init__()
if __name__ == "__main__":
a = A.getInstance()
print a
untitled.print_a()
def print_a():
import test
print test.A.getInstance()
...这里是python test.py
<__main__.A object at 0xaea270>
<test.A object at 0xaea3f0>
有人可以向我解释导致此行为的情况(显然是在模块级别)吗?
答案 0 :(得分:3)
获得两个单身的原因是由于模块的导入方式。从命令行执行test.py时,它不是test
,而是__main__
。将一个条目添加到sys.modules
,名称为__main__
,然后执行。当无标题导入测试时,检查sys.modules
,找不到名为test
的模块,因此再次执行test.py以导入它。结果,A
的类定义被执行两次,产生两个不同的类。因此,Singleton实现认为它们是不同的,并产生两个实例。
答案 1 :(得分:0)
我不知道你为什么需要单身人士,但只是看看你指出的那个“单身混音”让我想起了一个老笑话链 - 电子邮件,展示了程序员(d)进化的各个阶段,与各种hello世界计划的例子。在那封电子邮件中,最低点是“企业级高级程序”,它开发了一个客户端服务器系统,实现了各种模式,以便编写“Hello World”。
在同一篇文章中,最重要的是“主黑客”,它用一个sngle行实现了Hello world: echo Hello World!
所以, 最有可能你只需要一个类,而不是它的实例。对于所有目的,它将表现得像一个单身人士。如果您想要设置shure,则不会实例化,只需在 new 方法上引发异常:
class SimpleSingleton(object):
@classmethod
def my_singleton_method(cls,):
pass
def __new__(cls):
raise TypeError("Cannot be instantiated")