我想了解如何__add__
works:
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__
is 反向添加。当Python尝试计算时x + y
它首先尝试调用x.__add__(y)
。如果失败则返回到y.__radd__(x)
.
这允许您仅通过触摸一个类来覆盖加法。例如,考虑 Python 如何评估0 + x
。致电0.__add__(x)
已尝试但是int
对你的班级一无所知。你不能很好地改变__add__
中的方法int
,因此需要__radd__
。我认为这是依赖倒置的一种形式。
正如史蒂文指出的那样,sum
就地操作,但从 0 开始。因此第一个加法是唯一需要使用的加法__radd__
。作为一个很好的练习,您可以检查情况是否如此!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)