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
相关产品推荐
相关产品推荐

