如何在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
相关产品推荐
相关产品推荐

