You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建新对象时类属性被覆盖的问题求助(附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:44:39