重写__add__方法后出现TypeError
我试图了解其__add__
工作原理:
class MyNum:
def __init__(self,num):
self.num=num
def __add__(self,other):
return MyNum(self.num+other.num)
def __str__(self):
return str(self.num)
如果我把它们放在列表中
d=[MyNum(i) for i in range(10)]
这有效
t=MyNum(0)
for n in d:
t=t+n
print t
但这不是:
print sum(d)
TypeError: unsupported operand type(s) for +: 'int' and 'instance'
我究竟做错了什么?如何获得 sum() 来工作?
更新
我的问题是如何在支持的对象列表上使用总和__add__
,需要使其尽可能通用。
-
您还需要定义
__radd__
才能使它起作用。__radd__
是 反向添加 。当Python尝试评估时,x + y
它首先尝试调用x.__add__(y)
。如果失败,则返回到y.__radd__(x)
。这样,您仅需触摸一个班级即可覆盖加法。例如,考虑Python如何评估
0 + x
。0.__add__(x)
尝试进行呼叫,但int
对您的课程一无所知。您无法很好地更改__add__
方法int
,因此需要__radd__
。我想这是依赖倒置的一种形式。正如Steven所指出的那样,它
sum
在原地运行,但从0开始。因此,第一个加法是唯一需要使用的__radd__
。作为一项不错的练习,您可以检查是否是这种情况!