Python中如何通过匹配字符串名动态修改dataclass类的实例属性?
实现方案
可以通过Python内置的getattr()、setattr()方法实现该需求,这两个函数支持通过字符串格式的属性名读写对象的属性,完全可以替代冗长的if-else判断链。
完整可运行实现
from dataclasses import dataclass @dataclass class Rocket: fuel: int oxidizer: int weight: int power: int # 可选:提前定义允许修改的属性集合,避免误改其他属性 _ALLOWED_FIELDS = {'fuel', 'oxidizer', 'weight', 'power'} def decrease_value(self, attr_name: str, amount: int): # 第一步:校验属性合法性 if attr_name not in self._ALLOWED_FIELDS: raise ValueError(f"不允许修改属性:{attr_name},允许修改的属性为:{self._ALLOWED_FIELDS}") # 第二步:获取当前属性值 current_val = getattr(self, attr_name) # 可选:添加数值合法性校验,比如避免属性值变为负数 if current_val < amount: raise ValueError(f"属性{attr_name}当前值为{current_val},不足以减去{amount}") # 第三步:计算新值并赋值 setattr(self, attr_name, current_val - amount) # 注意:原代码中Rocket未实例化,需要补全实例化参数 r = Rocket(fuel=1000, oxidizer=800, weight=2500, power=1500) r.decrease_value('fuel', 200) r.decrease_value('weight', 55) print(r.fuel) # 输出 800 print(r.weight) # 输出 2445
方法说明
getattr(对象, 属性名字符串, 默认值):读取对象对应名称的属性,找不到属性时如果传入了默认值则返回默认值,否则抛出AttributeErrorsetattr(对象, 属性名字符串, 新值):给对象对应名称的属性赋值,属性不存在时会新增属性,因此建议加上文的合法属性校验,避免误新增属性- 如果你不需要严格限制可修改的属性,也可以用
hasattr(self, attr_name)替代_ALLOWED_FIELDS的判断,只要属性存在就允许修改
内容的提问来源于stack exchange,提问作者Grav
相关产品推荐
相关产品推荐

