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

Python自定义类__add__方法实现列表对应索引相加的报错排查

自定义类__add__方法报错排查:列表对应索引元素相加实现

我尝试给自定义类编写__add__方法,实现两个实例内部的列表按对应索引元素相加。示例如下:

a = Simpy([1.0, 1.0, 1.0])
b = Simpy([2.0, 3.0, 4.0])

执行c = a + b后,预期输出为:

Simpy([3.0, 4.0, 5.0])

要求不能使用zip()、map()等函数,我写了如下代码但报错,需要排查问题:

def __add__(self, rhs: Union[float, Simpy]) -> Simpy:
    result: Simpy = ([])
    if isinstance(rhs, Simpy):
        assert len(self.values) == len(rhs.values)
        for i in range(len(rhs.values)):
            result.values.append(self.values[i] + rhs.values[i])

报错原因分析

  • 实例初始化错误:result: Simpy = ([])这行完全错误,你不能直接把普通列表赋值给Simpy类型变量,必须通过类的构造方法创建实例(比如result = Simpy([]))。否则result本质是普通列表,没有values属性,执行result.values.append会直接抛出属性不存在的异常。
  • 缺少返回值:整个__add__方法没有return result语句,就算逻辑正确,调用a + b也会得到None,不符合预期。
  • 未处理float类型的rhs:方法参数声明了rhs可以是float,但代码只处理了Simpy实例的情况,传入float时会直接走到方法末尾,既不返回结果也不报错。
  • 循环范围可优化:虽然有断言保证两个实例的values长度相等,但用range(len(rhs.values))不如用self.values的长度,逻辑上更贴合自身实例的属性,不过这不是报错的直接原因。

修正后的代码示例

from typing import Union

class Simpy:
    def __init__(self, values):
        self.values = values
    
    def __add__(self, rhs: Union[float, 'Simpy']) -> 'Simpy':
        if isinstance(rhs, Simpy):
            assert len(self.values) == len(rhs.values), "两个实例的列表长度必须相等"
            result_values = []
            for i in range(len(self.values)):
                result_values.append(self.values[i] + rhs.values[i])
            return Simpy(result_values)
        elif isinstance(rhs, float):
            result_values = [val + rhs for val in self.values]
            return Simpy(result_values)
        else:
            raise TypeError(f"不支持与{type(rhs)}类型相加")
    
    def __repr__(self):
        return f"Simpy({self.values})"

# 测试
a = Simpy([1.0, 1.0, 1.0])
b = Simpy([2.0, 3.0, 4.0])
c = a + b
print(c)  # 输出: Simpy([3.0, 4.0, 5.0])

内容的提问来源于stack exchange,提问作者A Ab

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:45:35