Python自定义类实例列表调用内置sum函数报错问题
报错根本原因
内置sum函数默认的累加起始值是整数0,函数签名为sum(iterable, /, start=0)。你直接调用sum([a, b, c])时,实际执行的计算流程是0 + a + b + c,第一步就是整数和自定义string实例做加法,自然会抛出类型不匹配的错误。
你重写__iter__方法完全是找错了方向:sum只会遍历你传入的列表对象本身,根本不会调用列表内每个string实例的__iter__方法,你在方法里加的打印语句当然不会触发。
可行解决方案
选任意一种即可:
- 调用
sum时手动指定合法的起始值,不需要修改原有类代码:
# 传入自定义string类的空实例作为累加起点 print(sum([a, b, c], start=string('')))
执行后计算流程为string('') + a + b + c,完全复用你已经实现的__add__逻辑,可正常输出abc。
- 给自定义类补充反向加法方法
__radd__,兼容sum默认的整数0起始值:
在类中新增如下方法:
def __radd__(self, other): # 左操作数为sum默认的起始值0时,直接返回当前实例即可 if other == 0: return self return self._new(other, str.__add__)
添加后即使不传start参数,执行0 + a时会自动调用a.__radd__(0)返回实例a,后续累加流程可正常走完。
补充提示
你的自定义string类是单值封装类型,不是容器,本身不需要实现__iter__方法,之前的尝试属于完全没摸到报错根源做的无用功。
内容的提问来源于stack exchange,提问作者user16004728
相关产品推荐
相关产品推荐

