Python中如何通过输入变量动态选择访问类成员变量?
Python 动态操作类成员的实现方法
Python 原生支持根据变量动态选中、修改类/实例成员的需求,你写的thing_class.obj{number} = 10语法本身不成立——点操作符后面要求是固定的合法标识符,不支持直接做字符串插值,但可以通过标准内置方法实现完全一致的效果,和你用f-string拼接动态字符串的逻辑完全适配。
推荐方案:使用内置属性操作函数
Python 提供了三个专门用于动态属性操作的内置函数,无需额外导入模块,操作类对象、类实例都通用:
setattr(目标对象, 属性名字符串, 要设置的值):动态给对象设置指定属性getattr(目标对象, 属性名字符串, [可选默认值]):动态读取对象的指定属性,属性不存在时如果传了默认值就返回默认值,否则抛出AttributeErrorhasattr(目标对象, 属性名字符串):判断对象是否存在指定属性,返回布尔值delattr(目标对象, 属性名字符串):动态删除对象的指定属性
对应你需求的可运行代码如下:
class Thing: obj1 = 1 obj2 = 2 obj3 = 3 def update_thing_attr(thing_class, number): # 用你熟悉的f-string先拼出目标属性名 target_attr = f"obj{number}" # 可选:加合法性校验,避免传入不存在的编号时凭空新增类属性 if not hasattr(thing_class, target_attr): raise AttributeError(f"{thing_class.__name__} 没有名为 {target_attr} 的成员") # 动态修改对应属性的值 setattr(thing_class, target_attr, 10) # 测试效果 print(Thing.obj2) # 初始值输出2 update_thing_attr(Thing, 2) print(Thing.obj2) # 修改后输出10
其他可选方案
Python 中类和实例的成员本质存储在内部字典结构中,对于类的实例,也可以直接通过实例.__dict__[f"obj{number}"] = 10的方式赋值。但注意类本身的__dict__是只读的映射代理对象,不支持直接赋值修改,通用性远不如setattr,日常开发优先使用内置函数即可。
内容的提问来源于stack exchange,提问作者dyingplanet
相关产品推荐
相关产品推荐

