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

如何遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:26:51