小弟求助 关于类的实例化的问题 为什么 类都实例化了 俩变量居然指向同一个类

派大奇 2011-04-20 10:57:58

class test1: #类1
aaa=1
bbb={} #子典型 实际在应用中时指向的是 类2

class test2: #类2
bbb=2

test={} #做一个字典做测试 (这里就做简单的测试,用字典原因是 key的值经常是字符串 ,如果问题在这里 麻烦高人指点一下应该换成什么 能与字典有相同功能)

test[1]=test1() #字典中 key=1的 实例化 类1
test[2]=test1() #字典中 key=2的 实例化 类1

test[1].bbb[1]=test2() #字典中key=1的test1类中的 bbb字典1 实例化 test2类
test[1].bbb[2]=test2()
test[1].bbb[3]=test2()

test[2].bbb[4]=test2() #字典中key=2的test1类中的 bbb字典1 实例化 test2类

print id(test[1].bbb) #打印一下 两个字典中的 bbb
print id(test[2].bbb)


结果是:
39249360
39249360
相同的

实际应用中的问题是 我明明 只在 test[2]中 给 bbb 赋值了1个 ,但程序中 test[2].bbb 中却有 4个值
test[1]中 也只赋值了3个 但是运行 test[2] 后 test[1] 中也变了4个值


咋解决啊...... 高人 出现吧
...全文
74 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seaoh 2011-08-18
  • 打赏
  • 举报
回复
如果有__init__的话,属性bbb实际是赋予self(也就是实例对象)的。
class test1():
bbb = {}
这个bbb其实是类对象的属性,并不能继承给类的实例。
派大奇 2011-04-20
  • 打赏
  • 举报
回复
上面 代码 仅仅是为了 说明问题 特意手写了一段 实际的代码 有很长一段 我怕没人看
派大奇 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iambic 的回复:]

属性初始化放到__init__里。仔细看下别人的代码是怎么写的。
你的代码输出和你的预期一样,并不能说明你的道理就是对的。
[/Quote]

谢谢你
我加上
def __init__(self):
self.bbb={}
的确可以了

但是很是不理解... 原来 写C# 的时候就没这问题 在翻一个C#的程序 所以一样的想法写法 就出事了

以后会注意的 谢谢了
I_NBFA 2011-04-20
  • 打赏
  • 举报
回复
你的问题关系到类变量实例变量的区别,赋值'='的特性与可变与不可变类型的差异。
这些都是基础,所以有功夫纳闷劝你踏实下来去看书。
iambic 2011-04-20
  • 打赏
  • 举报
回复
没看到你的代码哪里用到了aaa。想说明问题贴代码。但是别贴顶楼那种乱七八糟的代码,什么test/test1/test2/aaa/bbb/1/2/3/4的,看着费劲。这种风格的代码写的稍微长点不出问题就见鬼了。
派大奇 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 iambic 的回复:]

属性初始化放到__init__里。仔细看下别人的代码是怎么写的。
你的代码输出和你的预期一样,并不能说明你的道理就是对的。
[/Quote]

那为什么 类1 里的 aaa=1 我没有初始化 就可以调用到值呢?

iambic 2011-04-20
  • 打赏
  • 举报
回复
属性初始化放到__init__里。仔细看下别人的代码是怎么写的。
你的代码输出和你的预期一样,并不能说明你的道理就是对的。
派大奇 2011-04-20
  • 打赏
  • 举报
回复
的确可以 改成 这样 也可以了

test[1].bbb={}
test[1].bbb[1]=test2() #字典中key=1的test1类中的 bbb字典1 实例化 test2类
test[1].bbb[2]=test2()
test[1].bbb[3]=test2()

test[2].bbb={}
test[2].bbb[4]=test2() #字典中key=2的test1类中的 bbb字典1 实例化 test2类

但是 我不明白的是 明明 此值已经在 类里 做了 {} 初始化 我初始化一个类 类肯定会初始化一个 {}

派大奇 2011-04-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 i_nbfa 的回复:]

解决啥了?谁说map不能用{}初始化?bbb根本就是个类变量实例化N次也跟实例对象没关系。
[/Quote]

你可以打开 python 试试代码
派大奇 2011-04-20
  • 打赏
  • 举报
回复
的确 解决了

test[1].bbb[1]=test2() #字典中key=1的test1类中的 bbb字典1 实例化 test2类
test[1].bbb[2]=test2()
test[1].bbb[3]=test2()

test[2].bbb[4]=test2() #字典中key=2的test1类中的 bbb字典1 实例化 test2类

代码这么写就肯定不行


改成下面这样就可以了
test[1].bbb={-1:test2()}
test[1].bbb[1]=test2() #字典中key=1的test1类中的 bbb字典1 实例化 test2类
test[1].bbb[2]=test2()
test[1].bbb[3]=test2()

test[2].bbb={-2:test2()}
test[2].bbb[4]=test2() #字典中key=2的test1类中的 bbb字典1 实例化 test2类
I_NBFA 2011-04-20
  • 打赏
  • 举报
回复
解决啥了?谁说map不能用{}初始化?bbb根本就是个类变量实例化N次也跟实例对象没关系。
派大奇 2011-04-20
  • 打赏
  • 举报
回复
哎 自己解决了 原来字典 实例化不能用 {} 来表示 哎 这样跟没实例化一样

哎 有没有人进来 给分了
派大奇 2011-04-20
  • 打赏
  • 举报
回复
CSDN 也出错的??

test[1].bbb[1]=test2() #字典中key=1的test1类中的 bbb字典1 实例化 test2类
test[1].bbb[2]=test2()
test[1].bbb[3]=test2()

test[2].bbb[4]=test2() #字典中key=2的test1类中的 bbb字典1 实例化 test2类

怎么变成别的了
派大奇 2011-04-20
  • 打赏
  • 举报
回复
我自己测试了一下 发现 好像是字典 实例化的问题
将下面代码

test[1].bbb[1]=test2() #字典中key=1的test1类中的 bbb字典1 实例化 test2类
test[1].bbb[2]=test2()
test[1].bbb[3]=test2()

test[2].bbb[4]=test2() #字典中key=2的test1类中的 bbb字典1 实例化 test2


改成一下面

test[1].bbb={1:test2(),2:test2(),3:test2()}

test[2].bbb={4:test2()}


就没问题了

但是实际应用中 test[1].bbb 需要填入字典的项是不固定的 还是继续等待 高人指点一下

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧