单模跨模块

时间:2012-06-11 17:21:18

标签: python design-patterns singleton

我正在尝试实现Singleton,并且在导入模块时遇到了困难。我的设置如下。我使用的是Python 2.7。

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

MODULE 2

import SingletonClass

class AnotherClass:
    print SingletonClass.SingletonClass() #OUTPUT: 0x0000000003292208

在模块中单例正在工作,但在另一个模块中,Singleton没有返回与第一个相同的对象。知道为什么吗?

修改

现在我将把我发现的唯一有效的东西放进去。我确信有更好的解决方案,但我认为这可能更好地传达了潜在的问题。

MODULE 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

MODULE 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

MODULE 3

import SingletonClass

class AnotherClass:
    print SingletonClass.SingletonClass() #OUTPUT: 0x00000000030F1630

解决方案(编辑3)

课程:不要让你的主要功能与你的单身人士在同一个模块中!

1 个答案:

答案 0 :(得分:2)

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

要测试此项,请添加以下内容:

print "Being imported..."

module1.py

如果此消息打印两次,则导入模块两次,这就是您的问题。要解决此问题,请确保使用相同的名称将模块导入到任何地方[0],并且您没有使用sys.path执行hackery。

[0]:从技术上讲,这不是必要的,但这是一个简单的解决方法。