4

我正在尝试实现单例,但在导入模块时遇到了困难。我的设置如下。我正在使用 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 放在同一个模块中!

4

1 回答 1

2

您的问题很可能是模块以两个不同的名称被导入两次。

要对此进行测试,请添加以下内容:

print "Being imported..."

module1.py.

如果此消息被打印两次,则模块被导入两次,这就是您的问题。要修复它,请确保您使用相同的名称在任何地方导入模块[0],并且您没有使用sys.path.

[0]:从技术上讲,这不应该是必要的,但这是一个简单的修复。

于 2012-06-12T01:59:33.020 回答