首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Borg模式在两个不同模块中使用时的意外行为

Borg模式在两个不同模块中使用时的意外行为
EN

Stack Overflow用户
提问于 2009-09-11 09:21:49
回答 5查看 474关注 0票数 1

我使用的是Borg模式,其中包含了相互包含的模块。参见下面的示例代码(不是真正的代码,但它显示了问题)。在本例中,我有两个不同的Borg,因为解释器认为类名(我猜是类)是不同的。

在这种情况下,有没有一种方法可以在不修改模块架构的情况下使用Borg?

模块borg.py

代码语言:javascript
复制
import borg2

class Borg:
    _we_are_one = {}

    def __init__(self):
        self.__dict__ = Borg._we_are_one
        try:
            self.name
        except AttributeError:
            self.name = "?"
        print self.__class__, id(self.__dict__)

def fct_ab():
    a = Borg()
    a.name = "Bjorn"

    b = Borg()
    print b.name

if __name__ == "__main__":
    fct_ab()
    borg2.fct_c()

模块borg2.py

代码语言:javascript
复制
import borg

def fct_c():
    c = borg.Borg()
    print c.name

结果是

代码语言:javascript
复制
__main__.Borg 40106720
__main__.Borg 40106720
Bjorn
borg.Borg 40106288
?

为了澄清我的问题:为什么Python认为__main__.Borgborg.Borg是两个不同的类?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-11 09:41:03

这个问题只出现在你的main函数中。将该代码移动到它自己的文件中,一切都如您所愿。这段代码

代码语言:javascript
复制
import borg
import borg2

if __name__ == "__main__":
    borg.fct_ab()
    borg2.fct_c()

提供以下输出:

代码语言:javascript
复制
borg.Borg 10438672
borg.Borg 10438672
Bjorn
borg.Borg 10438672
Bjorn
票数 3
EN

Stack Overflow用户

发布于 2010-01-04 06:03:24

在与Singletons和Borg斗争了一天之后,我的结论如下:

似乎使用不同的“导入路径”多次导入的Python模块实际上是多次导入的。如果该模块包含一个单例,则会得到多个实例。

示例:

代码语言:javascript
复制
myproject/
  module_A
  some_folder/
    module_B
    module_C

如果module_A使用from myproject.some_folder import module_C导入module_C,而module_B使用import module_C导入相同的module_C,那么该模块实际上会导入两次(至少根据我的观察)。通常,这并不重要,但对于单例或borg,你实际上得到了两个应该是唯一的实例。(这是共享两个不同内部状态的两组机器人)。

解决方案:给自己一个导入语句约定,并遵守它:我从一个公共根文件夹开始导入所有模块,即使模块文件与我正在处理的文件平行,因此在上面的示例中,module_A和module_B都使用from myproject.some_folder import module_C导入module_C。

票数 4
EN

Stack Overflow用户

发布于 2009-09-11 09:40:17

问题不在于类名。我不完全确定为什么Python将Borg类和borg.Borg类视为不同的类,也许是因为您从__main__运行它,我认为python没有意识到__main__和borg是同一个模块。

解决方案很简单。将fct_ab更改为:

代码语言:javascript
复制
def fct_ab():
    import borg
    a =  borg.Borg()
    a.name = "Bjorn"

    b = borg.Borg()
    print b.name

这就解决了问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1409917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档