Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为自定义数据类型实现sum()_Python_Python 3.x_Overloading_Custom Data Type - Fatal编程技术网

Python 为自定义数据类型实现sum()

Python 为自定义数据类型实现sum(),python,python-3.x,overloading,custom-data-type,Python,Python 3.x,Overloading,Custom Data Type,据我所知,要在对象上强制转换sum(),它必须是一个iterable,并且必须是“addable”,也就是说,它必须实现方法\uuuu iter\uuuu和\uu add\uu。但是,当我为我的类点(只是一个示例)执行此操作时,这不起作用 类点: 定义初始化(self,x,y): self.x=x self.y=y 定义添加(自身、其他): 返回点(self.x+other.x,self.y+other.y) 定义(自我): 回归自我 定义(自我): 返回str((self.x,self.y))

据我所知,要在对象上强制转换
sum()
,它必须是一个iterable,并且必须是“addable”,也就是说,它必须实现方法
\uuuu iter\uuuu
\uu add\uu
。但是,当我为我的类
(只是一个示例)执行此操作时,这不起作用

类点:
定义初始化(self,x,y):
self.x=x
self.y=y
定义添加(自身、其他):
返回点(self.x+other.x,self.y+other.y)
定义(自我):
回归自我
定义(自我):
返回str((self.x,self.y))
打印(点(2,2)+点(1,1))
>>>(3,3)#如预期;好!!
点=[点(0,0),点(2,0),点(0,2),点(2,2)]
打印(总和(点数))#期望值(4,4)
>>>TypeError:不支持+:“int”和“Point”的操作数类型

如果我实现了与
\uuuuu add\uuuuu
相同的
\uuuu radd\uuuuu
,那么当我尝试
sum()
时,我会得到一个属性错误:

AttributeError:'int'对象没有属性“x”
基于这些错误,我的
在某个地方被分隔为
整数
,但我不确定在哪里。
感谢您的帮助。

之所以会发生这种情况,是因为
sum
以默认值
int
开始,当执行
sum(points)
时,实际发生的是
sum
首先尝试添加
0+点(0,0)
,因此出现错误。如果您查看
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))


请注意,
sum
不需要用于非数字类型。然而,还不完全清楚,<代码>和> /代码>将考虑一种数字类型。(例如,它适用于
list
s,但显式拒绝
str
s)这不是因为
''。join()
sum()
更适合字符串串联吗?编辑,看它绝对是,尽管我不完全确定为什么
sum
不能实现调用
join
本身,而不是引发异常。我倾向于同意,上面线程中的一些其他人也同意。有趣,谢谢。我想知道为什么选择了从0开始的
sum(sequence)
,而不是从左到右(或从右到左)添加元素。也许是为了处理
len(sequence)的情况,我不太确定实现为什么选择了这个。我必须检查:)
0
只是默认的起始值,既可以处理空序列,也可以正常使用简单求和值。如果愿意,可以传递不同的起始值<代码>总和(值,x)=x+总和(值)
。例如,
sum([[1],[2]],[3])==[3]+sum([[1],[2]],[])==[3,1,2]
。是的,将起始值设置为0是有意义的。有一个起始值比较容易,因为通常iterable的项通常是数字,起始值不允许是字符串。
>>> print(sum(points, Point(0, 0)))