为什么我在不同的模块中获得相同单例的不同实例?

时间:2011-01-28 01:59:42

标签: python module singleton instances

我有两个打印单例实例的文件,但我得到了两个不同的实例。

我正在使用Gary Robinson中的单一代码。

以下是文件:

test.py

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()

untitled.py

def print_a():
    import test
    print test.A.getInstance()

...这里是python test.py

的输出
<__main__.A object at 0xaea270>
<test.A object at 0xaea3f0>

有人可以向我解释导致此行为的情况(显然是在模块级别)吗?

2 个答案:

答案 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")