【发布时间】:2020-03-13 22:20:27
【问题描述】:
据我了解,为了能够将sum() 投射到对象上,它必须是可迭代的,并且必须是“可添加的”,即它必须实现方法__iter__ 和__add__。但是,当我为我的班级 Point(只是一个示例)执行此操作时,这不起作用。
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Point(self.x + other.x, self.y + other.y)
def __iter__(self):
return self
def __str__(self):
return str((self.x, self.y))
print(Point(2, 2) + Point(1, 1))
>>> (3, 3) # As expected; good!
points = [Point(0, 0), Point(2, 0), Point(0, 2), Point(2, 2)]
print(sum(points)) # Expect (4, 4)
>>> TypeError: unsupported operand type(s) for +: 'int' and 'Point'
如果我实现__radd__ 与__add__ 相同,那么当我尝试sum() 时会出现属性错误:
AttributeError: 'int' object has no attribute 'x'
基于错误,我的 Points 在某处被分隔为 ints,但我不确定在哪里。
感谢您的帮助。
【问题讨论】:
-
请注意,
sum不需要用于非数字类型。不过,尚不完全清楚sum将什么视为数字类型。 (例如,它适用于lists,但明确拒绝strs。) -
这不只是因为
''.join()是比sum()更好的字符串连接替代方案吗?编辑,见this answer -
绝对是,虽然我不完全确定为什么不能实现
sum来调用join本身,而不是引发异常。 -
我倾向于同意,上述线程中的其他一些人也同意。
标签: python python-3.x overloading custom-data-type