重写 __add__ 方法后出现类型错误

2024-01-21

我想了解如何__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(使用前将#替换为@)

重写 __add__ 方法后出现类型错误 的相关文章