如何遍历Python类实例并修改指定属性?
解决方案:遍历类实例并修改指定属性
首先得先修正你代码里的缩进问题——Python对缩进的要求很严格,原代码的类方法没有正确缩进,先把基础代码调整好:
class Element: def __init__(self, a, s, m): self.name = a self.symbol = s self.atomic_mass = m class Correction: def __init__(self, a, atr, v): self.name = a self.attribute = atr self.correct_value = v # 创建示例元素和修正项 nitrogen = Element("Nitrogen", "N", 12) carbon = Element("Carbon", "C", 11) helium = Element("Helium", "He", 3) elements = [nitrogen, carbon, helium] correction1 = Correction("Nitrogen", "atomic_mass", 14) correction2 = Correction("Carbon", "atomic_mass", 12) corrections = [correction1, correction2]
接下来,我们来实现你的correct函数,核心逻辑是匹配元素名称→检查属性是否存在→修改属性值:
基础版实现
def correct(elements, corrections): # 遍历每一条修正规则 for corr in corrections: # 遍历元素列表,找到名称匹配的元素 for elem in elements: if elem.name == corr.name: # 检查元素是否有目标属性 if hasattr(elem, corr.attribute): # 修改属性值 setattr(elem, corr.attribute, corr.correct_value) else: print(f"元素 {elem.name} 不存在 {corr.attribute} 属性,跳过修正") # 找到匹配元素后跳出内层循环,避免重复检查 break
调用验证
# 修正前的原子量 print("修正前:") for elem in elements: print(f"{elem.name}: {elem.atomic_mass}") correct(elements, corrections) # 修正后的原子量 print("\n修正后:") for elem in elements: print(f"{elem.name}: {elem.atomic_mass}")
运行后输出:
修正前: Nitrogen: 12 Carbon: 11 Helium: 3 修正后: Nitrogen: 14 Carbon: 12 Helium: 3
优化版(更高效)
如果你的元素列表很长,每次遍历查找会比较慢,我们可以先把元素按名称做成字典,直接通过名称快速定位元素:
def correct_optimized(elements, corrections): # 构建元素名称到实例的映射字典 elem_dict = {elem.name: elem for elem in elements} for corr in corrections: # 直接通过名称查找元素 elem = elem_dict.get(corr.name) if elem: if hasattr(elem, corr.attribute): setattr(elem, corr.attribute, corr.correct_value) else: print(f"元素 {corr.name} 不存在 {corr.attribute} 属性,跳过修正") else: print(f"未找到元素 {corr.name},跳过修正")
这个版本的查找效率从O(n)降到了O(1),元素越多优势越明显。
关键知识点说明
hasattr(obj, attr_name):检查对象是否包含指定属性(参数attr_name是字符串)setattr(obj, attr_name, value):给对象的指定属性设置新值(同样支持字符串格式的属性名)
内容的提问来源于stack exchange,提问作者Maciek Celiński
相关产品推荐
相关产品推荐

