当前位置: 首页 > 面试题库 >

重写__add__方法后出现TypeError

长孙波鸿
2023-03-14
问题内容

我试图了解其__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 + x0.__add__(x)尝试进行呼叫,但int对您的课程一无所知。您无法很好地更改__add__方法int,因此需要__radd__。我想这是依赖倒置的一种形式。

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



 类似资料:
  • 有一个带有一些功能的接口。基类实现接口。然后在子类中重写函数。 但是@override给出了编译器错误“方法不从其超类重写方法” 问题:在子类中,如何覆盖基类中实现的接口函数? }

  • subA类是A类的子类。我试图重写一个方法,但不知怎的,它不允许我重写它。为什么会这样?是因为参数中的参数吗? 读取错误消息: 名称冲突:subA中的add(E#1)和A中的add(E#2)具有相同的擦除,但两者都不重写另一个,其中E#1、E#2是类型变量: E#1扩展了subA类中声明的对象 E#2扩展了A类中声明的对象 超类A: 子类subA:

  • 问题内容: 我将测试用例中的方法重写为模拟Socket中的pas。完成此操作后,对象将不再可序列化。 这是不起作用的示例。 Foo.java FooTest.java 使用JUnit运行FooTest时的堆栈跟踪: 这是什么问题?我不得不承认,我并没有深入研究Java的Serializable接口,或多或少只是遵循了Eclipse的快速修复程序。 更具体地讲我的实现: 我有一个应该通过Object

  • 我创建了一个(个人、学生、员工、教职员工)类。Person必须将Student和Employee分为子类。Employee有两个子类:教员和职员。我已经完成了所有的编码,他们工作得很好,除了我的驱动程序类TestPerson程序给出了编译错误 注:一个测试程序,创建一个人、学生、员工、教职员工,并调用他们的toString方法。 驱动程序类TestPerson的错误。以下是java:- **我只是

  • 本文向大家介绍写一个方法实现promise失败后自动重试相关面试题,主要包含被问及写一个方法实现promise失败后自动重试时的应答技巧和注意事项,需要的朋友参考一下 1.首先来个封装获取数据的 Promise方法 function getData(){ let p = new Promise((resolve,reject)=>{ setTimeout(()=>{ // 定义一个随机数 let

  • 在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为 方法重写(override),又称为 方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。 子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。 在重写方法时,需要遵循