0

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

我正在使用Gary Robinson的 Singleton 代码。

以下是文件:

测试.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()

无标题.py

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

...这是输出python test.py

<__main__.A object at 0xaea270>
<test.A object at 0xaea3f0>

有人可以向我解释导致这种行为的原因(显然是在模块级别)吗?

4

2 回答 2

3

你得到两个单例的原因是模块被导入的方式。当您从命令行执行 test.py 时,它不称为test,它是__main__. sys.modules在 name 下添加一个条目__main__,然后继续执行。检查untitled imports test 时sys.modules,没有test找到名为的模块,因此再次执行 test.py 以导入它。结果,类定义A被执行了两次,产生了两个不同的类。因此,单例实现认为它们是不同的,并产生两个实例。

于 2011-01-28T03:34:04.803 回答
0

我不知道你为什么需要单例,但是看看你指出的“单例混合”也让我想起了一个古老的笑话链电子邮件,展示了程序员(d)进化的各个阶段,有各种例子hello world 程序。在那封邮件中,最低点是“企业级高级程序”,它开发了一个客户端服务器系统,实现了各种模式,以编写“Hello World”。

在同一篇文章中,最重要的是“黑客大师”,它用一行代码实现了 Hello world:echo Hello World!

因此,很可能您需要的只是一个使用该类而不是其实例的类。出于所有目的,它将表现得像一个单身人士。如果你想让 shure 不实例化,只需在方法上引发异常:

class SimpleSingleton(object):
    @classmethod
    def my_singleton_method(cls,):
         pass
    def __new__(cls):
         raise TypeError("Cannot be instantiated")
于 2011-01-28T02:17:46.677 回答