社区首页 >问答首页 >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

复制
相关文章
从文字到画作
通过文字描述一个场景或一个人,然后计算机就会按照你的描述生成画作。目前有很多开源或闭源产品,比如最近比较火的Stable Diffusion 、DALL·E,国内的Paddlepaddle都实现从文本到图像。
TalkPython
2022/11/21
3100
从文字到画作
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
1、std::string 和QString在网络传输的过程中是不建议配套的,传过去,接到就成乱码了。 我因为这个愚蠢而把我们客户端人员坑惨了。
看、未来
2020/08/26
1.7K0
char 、char[]、char*、 const char*、string(无效的const char *到XXXX的转化)
为什么不推荐使用BeanUtils属性转换工具
1 背景 之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。
崔笑颜
2020/07/23
1.7K0
为什么不推荐使用BeanUtils属性转换工具
从char 数据类型到smalldatetime 数据类型的转换导致smalldatetime 值越界
select * from dbo.pds_operation_log where ( plan_code=12 and create_time between ‘1900-01-01’ and ‘2098-12-31’ ) order by create_time asc
全栈程序员站长
2022/08/30
7010
为什么不推荐使用BeanUtils属性转换工具
之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。
明明如月学长
2021/08/31
7920
为什么不推荐使用BeanUtils属性转换工具
java字符数组char[]和字符串String之间的转换
使用String.valueOf()将字符数组转换成字符串 void (){ char[] s={'A','G','C','T'}; String st=String.valueOf(s); System.out.println("This is : "+st); } >> This is : AGCT 使用.toCharArray()将字符串转换成字符数组 String st="AGCT"; char[] s=st.toCharArray(); for (int i=0;i<st.leng
演化计算与人工智能
2020/08/14
2.2K0
c++char和int转换_int转换为char数组
在学习c++,opencv时,想读取有规律的一些图像,图像名时有规律的数字,要用到int 转char* 类型,可以写代码,但是为了方便和整洁打算用c++自带的函数写成。 在转换时要用char []类的,因为在这里我们不能初始化char*所以要分配一块内存空间。
全栈程序员站长
2022/11/01
1.2K0
char转换为数字_char字符转int
刷题遇到一个考点是 char型数字 转 int 进行计算的问题。一看就会,一做就错,显然是在这里的认识薄弱了。将一番搜索的结果记录下来,以备再忘来打脸。
全栈程序员站长
2022/11/10
4.1K0
C++ char*,const char*,string的相互转换
转自:http://blog.163.com/reviver@126/blog/static/1620854362012118115413701/
forrestlin
2022/04/02
1.2K0
java int与char的转换
char与int的相互转化,联想ASCII码,字符‘0’对应的值为48,所以不能直接加减‘ ’
SingYi
2022/07/14
5000
char *转换为string的陷阱:char*中包含较多的'\0'
今天给团队调试一个错误,概率性的加密的数据没法做解密,现象是解密出来的结果和源数据长度不一致,很奇怪的现象,因为加密使用的数据是随机的,所以使得问题出现时表象是概率的问题;
呱牛笔记
2023/05/02
6920
char *转换为string的陷阱:char*中包含较多的'\0'
ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小
做项目的时候遇到一个报错:ORA-22835 缓冲区对于 CLOB 到 CHAR 转换或 BLOB 到 RAW 转换而言太小。查找原因发现是某个字段在数据库中是clob类型。然后sql语句进行查询的时候,对该字段进行了to_char操作。由于varchar类型最大长度为4000,而clob中的内容长度高于4000。于是产生这样的问题。针对这个问题,结合自己的测试,想了以下三种解决方法,在此进行记录。
星哥玩云
2022/08/17
5.5K0
『C++』字符串后面空字符的问题(char*与string的转换)
此时输出结果应为mynameis,然而输出结果为mynameis口(空字符标志打不出来); 所以用字符数组给string赋值时要用assign()
风骨散人Chiam
2020/10/28
9900
QString与char *的相互转换
在进行编程时,我们经常需要用到字符串这种类型,毫无疑问,Qt 库中也对字符串类型进行了封装,QString 类提供了你能想到的所有字符串操作方法,给开发者带来了极大方便。
全栈程序员站长
2022/08/26
2.6K0
一句SQL,判断char列的值是否组成回文字符串
Table t has 2 columns: id INT; value CHAR(1); Column id starts from 0, increased by 1 each row Column value is a single character string Table t has at least 1 row String s is a palindrome when: s[i] = s[s.length - i - 1] for i = 0 … (s.length – 1) / 2 E.g.: a, aba, abba. Q: Write one SQL statement to check if the string composed of value of t ordered by id is a palindrome (case sensitive). Output “Y” or “N”.
小爷毛毛_卓寿杰
2019/02/13
8440
一句SQL,判断char列的值是否组成回文字符串
char转换成string java_int类型转换成char类型
原文地址:http://www.only-demo.com/java/20190220/277.html
全栈程序员站长
2022/11/09
8490
char类型转换成int_char 转int
程序真的是极简啊,用联合类型有时候用来转换数据类型是非常方便实用的,其中的原理就是因为联合类型共用一个内存空间咯,但是要注意它是小端模式存储的,低字节对应低地址。
全栈程序员站长
2022/09/27
3.3K0
char类型转换成int_char 转int
为什么不推荐使用PHPicker
iOS 14 中系统新增了一个图片选择器 PHPicker,官方建议使用 PHPicker 来替代原有的 API 进行图片选择,下面我们来看看 PHPicker 的优点:
ios-lan
2020/10/23
2.6K0
为什么不推荐使用PHPicker
Qt中QString 和 int char char*等相互转换
在编写Qt程序过程中经常遇到各种数据类型的转换,故此写下来方便自己和大家的查找。叮!!!
用户5908113
2019/07/30
4.2K0
点击加载更多

相似问题

不推荐使用从字符串到char*的转换

10

从字符串常量到“char*”的不推荐转换

43

从字符串常量到char *错误的不推荐转换

52

C++不推荐使用从字符串常量到'char*‘的转换

11140

C++ -从字符串常量到“char*”的不推荐转换

45
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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