创建新对象时类属性被覆盖的问题求助(附Python代码)
问题分析与解决办法
嘿,我一眼就看出问题出在哪了——你的Node类把id定义成了类属性,而不是实例属性,这才导致创建新对象时属性被覆盖!
问题根源
在Node的__init__方法里,你写的是Node.id = Node.count,这里的Node.id是类属性,属于整个Node类,所有Node实例都会共享这个值。每次创建新的Node对象,都会把这个类属性的值更新成当前的count,所以最后所有Node实例的id都会变成最后一次赋值的结果。
你可以看自己代码里的打印逻辑:第一次循环创建Node时,打印的是刚赋值的类属性值,看起来是对的;但第二次循环打印时,所有实例的id已经被最后一次创建的Node覆盖成同一个值了。
修复方案
只需要把Node类里的id改成实例属性,也就是用self.id代替Node.id,这样每个Node实例都会拥有自己独立的id,不会互相影响。
修改后的完整代码:
class Node: count = 0 def __init__(self): self.id = Node.count # 给当前实例分配独有的id Node.count += 1 # 类计数正常自增 @classmethod def get_count(cls): return Node.count class Element: count = 0 def __init__(self, type = "MTH20", group = 0): self.type = type self.group = group Element.count += 1 def define_element(self): self.nodes = [-1]*3 for l in range(len(self.nodes)): if self.nodes[l] == -1: self.nodes[l] = Node() print(self.nodes[l].id) for l in range(len(self.nodes)): print(self.nodes[l].id) # 测试一下 e = Element() e.define_element()
测试效果
运行上面的代码,你会得到如下输出:
0 1 2 0 1 2
两次循环的打印结果完全一致,说明每个Node实例的id都保持了自己的独立值,再也不会被覆盖啦!
内容的提问来源于stack exchange,提问作者gazoh
相关产品推荐
相关产品推荐

