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

如何在Python循环中修改类的实例属性值?

问题原因

你原来的写法不生效是因为float属于不可变数据类型,执行list_b = [m.x, m.y]时,只是把实例属性的当前值拷贝存入了列表,后续字典里存储的也只是这些值的副本,和实例本身的属性已经没有绑定关系,修改字典的值自然不会同步到实例属性。

可行实现方案

你只需要调整字典的映射规则:把字典的值从「属性值」改成「属性名称字符串」,配合Python内置的setattr()函数就能动态批量更新实例属性,完全可以在循环里实现需求。

修正后的代码示例

class MyClass:
    def __init__(self):
        self.x = 10.0
        self.y = 20.0

    def get_user_input(self):
        usr_ret = input("input a number :")
        # 可按需添加输入合法性校验、类型转换逻辑
        return float(usr_ret)


if __name__ == "__main__":
    m = MyClass()
    print(f"修改前x的值:{m.x},y的值:{m.y}")
    # 调整映射规则:键是用户可见的提示名,值是对应的实例属性名
    name_attr_map = {
        "x_related_name": "x",
        "y_related_name": "y"
    }

    # 循环更新属性
    for show_name, attr_name in name_attr_map.items():
        # 可替换为你环境中的内置对话框逻辑,此处用输入示例代替
        choice = input(f"是否要修改json文件中的{show_name}?(y/n)").strip().lower()
        if choice == 'y':
            new_val = m.get_user_input()
            # 核心逻辑:用setattr动态给实例设置属性值
            setattr(m, attr_name, new_val)
    
    print(f"修改后x的值:{m.x},y的值:{m.y}")

补充说明

  • 如果你需要动态读取实例属性,可以使用和setattr对应的getattr(实例对象, 属性名字符串),可以灵活实现各类动态操作
  • 该方案同样适配你环境中的内置对话框交互,只需要把示例中的input相关逻辑替换为你的对话框调用逻辑即可

内容的提问来源于stack exchange,提问作者Windy71

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:15:03