我有一个自己实现__add__
的课程:
class Point(namedtuple('Point', ['x', 'y', 'z'])):
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y, self.z + other.z)
添加按预期工作:
l = [Point(0,0,0), Point(0,1,2)]
s = l[0]
for a in l[1:]:
s = s + a
但是当我使用内置sum
时,我收到错误:
s = sum(l)
TypeError:+:' int'不支持的操作数类型和'点'
我的代码有什么问题?没有sum
使用__add__
吗?我还应该覆盖什么?
答案 0 :(得分:4)
sum
函数使用整数值0初始化其结果变量:
sum(iterable[, start]) -> value
Return the sum of an iterable of numbers (NOT strings) plus the value
of parameter 'start' (which defaults to 0).
因此,在总和中,执行了加法0 + Point(0,0,0)
,您的班级不支持。
要解决此问题,请为start
传递合适的值:
s = sum(l, Point(0,0,0))
答案 1 :(得分:2)
您还可以覆盖__radd__()
功能:
def __radd__(self, other):
return Point(self.x + other, self.y + other, self.z + other)
请注意,必须另外以覆盖__add__()