重写__add__方法后出现TypeError

发布于 2021-01-29 19:11:26

我试图了解其__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__,需要使其尽可能通用。

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您还需要定义__radd__才能使它起作用。

    __radd__反向添加 。当Python尝试评估时,x + y它首先尝试调用x.__add__(y)。如果失败,则返回到y.__radd__(x)

    这样,您仅需触摸一个班级即可覆盖加法。例如,考虑Python如何评估0 + x0.__add__(x)尝试进行呼叫,但int对您的课程一无所知。您无法很好地更改__add__方法int,因此需要__radd__。我想这是依赖倒置的一种形式。

    正如Steven所指出的那样,它sum在原地运行,但从0开始。因此,第一个加法是唯一需要使用的__radd__。作为一项不错的练习,您可以检查是否是这种情况!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看