跨模块的单例

2024-09-29 17:21:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图实现一个Singleton,当我导入模块时遇到了困难。我的设置如下。我使用的是python2.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

^{pr2}$

在模块中,singleton正在工作,但在另一个模块中,singleton返回的对象与第一个模块中的对象不同。知道为什么吗?在

编辑

现在我要把我发现的唯一有用的东西放进去。我相信有更好的解决办法,但我认为这可能会更好地传达出根本问题所在。在

模块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)

教训:不要把你的主函数和你的单例函数放在同一个模块中!在


Tags: 模块instanceselfnewoutputifobjectdef
1条回答
网友
1楼 · 发布于 2024-09-29 17:21:22

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

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

print "Being imported..."

module1.py中。在

如果这个模块被导入两次,那么这个模块就被打印了两次。要修复它,请确保您使用相同的名称在任何地方导入模块[0],并且您没有使用sys.path进行黑客攻击。在

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

相关问题 更多 >

    热门问题