据我了解,要使其能够投射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
是,从默认值开始,int
并且在执行sum(points)
实际sum
操作时首先尝试添加0 + Point(0, 0)
,因此出现错误。如果您查看上的帮助sum
,这将非常明显,
模块内置函数中内置函数求和的帮助:
sum(iterable,start = 0,/)返回“开始”值(默认值:0)加上一个可迭代数字的和
When the iterable is empty, return the start value. This function is intended specifically for use with numeric values and may reject non-numeric types.
更改为
>>> print(sum(points))
至
>>> print(sum(points, Point(0, 0)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句