社区首页 >问答首页 >Borg模式在两个不同模块中使用时的意外行为

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

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

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

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

模块borg.py

代码语言:javascript
代码运行次数:0
复制
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
代码运行次数:0
复制
import borg

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

结果是

代码语言:javascript
代码运行次数:0
复制
__main__.Borg 40106720
__main__.Borg 40106720
Bjorn
borg.Borg 40106288
?

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

EN

回答 5

Stack Overflow用户

回答已采纳

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

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

代码语言:javascript
代码运行次数:0
复制
import borg
import borg2

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

提供以下输出:

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

Stack Overflow用户

发布于 2010-01-03 22:03:24

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

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

示例:

代码语言:javascript
代码运行次数:0
复制
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 01:40:17

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

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

代码语言:javascript
代码运行次数:0
复制
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

复制
相关文章
华为交换机密码设置方法
华为交换机密码设置,此教程包括consle口密码设置和telnet远程登陆密码设置,华为所有交换产品设置方法一致。
时代疯
2021/07/20
6.9K0
poe交换机连接方式_路由器接交换机怎么设置
POE也被称为基于局域网的供电系统或有源以太网,有时也被简称为以太网供电,一个完整的POE系统包括供电端设备和受电端设备两部分。可能会有一些朋友对poe供电有一些疑问,这个在之前也有很多朋友问到过,那么,今天就由飞畅科技的小编来用图文为大家详细介绍下poe的几种供电方式和连接方法,感兴趣的朋友就一起来看看吧!
全栈程序员站长
2022/11/09
2.5K0
poe交换机连接方式_路由器接交换机怎么设置
pycharm svn设置_新手配置交换机详细教程
1.打开pycharm设置配置svn.exe的地址 Seting-version control-subversion
全栈程序员站长
2022/09/25
6980
pycharm svn设置_新手配置交换机详细教程
Linux时间设置
文章时间:2022年2月15日 19:19:07 解决问题:Linux服务器设置时间 无敌设置(不管连不连网都可以) date -s "2022-02-14 15:52" hwclock -w 直接使用date进行设置,设置时间随心所欲,想怎么写就怎么写 云平台设置 腾讯云:https://cloud.tencent.com/document/product/213/30392 ntpdate命令 Linux服务器同步北京时间:http://wiki.nooss.cn/archives/424.html
华创信息技术
2022/05/28
12.3K0
LINUX安全设置
  在“/etc/lilo.conf”文件中加入三个参数:time-out,restricted,password。这三个参数可以使你的系统在启动lilo时就要求密码验证。
全栈程序员站长
2022/07/05
5.8K0
linux代理设置
有些局域网环境上网需要使用代理上网,图形界面的很好解决就设置一下浏览器的代理就好了,但是Linux纯命令行的界面就需要手动配置了。
孙杰
2019/10/29
9.1K0
Linux网卡设置
青丝束马尾
2024/09/02
1320
linux设置ip默认,Linux设置ip地址与默认网关[通俗易懂]
# ifconfig eth0 192.168.0.20 netmask 255.255.255.0
全栈程序员站长
2022/09/01
21.9K0
linux下设置locale
在Linux中,使用locale命令来设置和显示程序运行的语言环境,locale会根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统定义一个软件运行时的语言环境
dogfei
2020/07/31
15.4K0
Linux 下设置路由
# route -n                                                  // 显示路由表,哪条在前就用哪条,都没有就用default
一朵灼灼华
2022/08/05
6.1K0
Linux DISPLAY 变量设置
在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处. 直接登陆图形界面或者登陆命令行界面后使用startx启动图形, DISPLAY环境变量将自动设置为:0:0, 此时可以打开终端, 输出图形程序的名称(比如xclock)来启动程序, 图形将显示在本地窗口上, 在终端上输入printenv查看当前环境变量, 输出结果中有如下内容:
孙杰
2019/10/29
11.3K0
Linux设置开机启动
1.整理机器上面运行的服务,编些成sh脚本,文件为:/home/rc/exec.sh
三哥
2019/11/14
7.9K0
Linux设置静态IP
我的环境:CentOS 6.5 1. 登录 以root用户登录 2. 在终端中输入: vi /etc/sysconfig/network-scripts/ifcfg-eth0 (vi后面有个空格) 按Insert键进入编辑模式 ONBOOT=yes 开机自启动 BOOTPROTO=static  静态ip IPADDR=192.168.0.108  要设置的IP地址 NETMASK=255.255.255.0  子网掩码 GATEWAY=192.168.0.4  网关 按ESC键回到命令模式 按“shift
Java架构师历程
2018/09/26
9.2K0
Linux设置定时重启
因为有对服务器进行每天定时重启的需求,但是我不会操作,在百度和谷歌上难以找到这方面的文章,找到的文章写的方法也是临摹两可,所以就写了这篇文章分享我摸索出来的方法
曈曈too
2023/02/27
25K1
Linux网络的设置
一、介绍 目的:使Linux可以正常上网,前提是物理机可以上网 软件环境: 虚拟机版本: VMware Workstation 12, Linux系统版本:CentOS 7.3 二、设置网络 1,在登
Zoctopus
2018/06/04
5.2K0
linux常用设置命令
##常用指令mkdir 创建目录touch 创建空文件echo 创建带有内容的文件。cat 查看文件内容cp 拷贝mv 移动或重命名rm 删除文件-r 递归删除,可删除子目录及文件-f 强制删除find 在文件系统中搜索某文件grep 在文本文件中查找某个字符串rmdir 删除空目录pwd 显示当前目录ln 创建链接文件系统管理命令stat 显示
一觉睡到小时候
2022/11/16
4.4K0
Linux-网络设置
ubuntu18 以上/etc/network/interfaces 已经不再生效,改用netplan
孔西皮
2023/10/18
1730
Linux环境基本设置
安装好Linux系统后,通常要做一些基本设置,比如网络,防火墙等。 1.修改ip地址,执行如下命令: vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet ONBOOT=yes #开机使用 BOOTPROTO=static #ip地址设置为静态 IPADDR=192.168.92.82 #Linux服务器ip地址 GATEWAY=192.168.92.1 #网关地址 NETMASK=255.
sparkle123
2018/04/26
3.8K0
linux网络相关设置
NetworkManager服务配置文件,如果没有特殊需求不建议调整,如果需要调整的话,调整之前备份,调整完成重新启动服务
星哥玩云
2022/09/15
2.7K0
jvm linux 时区设置
在接入集团一个平台的时候,发现录制某个接口到测试环境回放,发现接口入参一致,一个start_day 一个end_day,但回放的时候会多调用一次数据库查询,很是奇怪;
千往
2018/08/02
8.3K0

相似问题

iPhone上的资源

30

iPhone UIView资源

12

iPhone资源调配

10

根据iPhone颜色更改颜色

11

iPhone的颜色面板

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文