Python中的__add__和+:针对浮点数和整数不同的行为

8

将整数值添加到浮点值时,我发现如果在浮点数上调用__add__方法,它可以正常工作,例如:

>>> n = 2.0
>>> m = 1
>>> n.__add__(m)
3.0

但如果传入整数则不行:

>>> m.__add__(n)
NotImplemented

一开始,我认为在 intfloat 类型中,只是实现了不同的 __add__ 方法(比如说,float 类型接受加操作符和 int 类型相加,但是 int 类型却不能接受 float 类型相加)。但后来我发现,如果用 + 操作符代替 __add__ 方法,一切都能正常工作:

>>> n + m
3.0
>>> m + n
3.0

有没有人知道为什么会出现这种情况?__add__+是否不是密切相关的?


NotImplemented 也会在 m.__radd__(n) 中返回。 - A. Vidor
@this-vidor:__radd__方法写错了。 - user2357112
@user2357112 真的!那就是解决方案。 - A. Vidor
1个回答

6

a + b不能直接转换为a.__add__(b)。如果a.__add__不存在或返回NotImplemented,或者ba类型的子类型实例,则还会尝试b.__radd__(a)


我仍然感到困惑。这个怎么解释 anInt.add(aFloat) == NotImplemented,但是 aFloat.add(anInt) 却产生了一个浮点数的和?我认为加号 / __add__ 应该是可交换的吗? - RBV
1
@RBV:既不是+也不是__add__满足交换律。+不满足交换律是因为像[1] + [2] != [2] + [1]这样的情况,而即使在+满足交换律的情况下,__add__也不一定满足交换律,因为只需要一个参数知道如何处理操作。 - user2357112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接