当将整数值添加到浮点值时,我意识到如果在浮点上调用该方法可以正常工作,例如:
__add__
但如果在整数上调用则不行:
>>> n = 2.0
>>> m = 1
>>> n.__add__(m)
3.0
起初我认为|| | 只是对
>>> m.__add__(n)
NotImplemented
和
__add__
类型的实现方式不同(例如 float 类型接受添加到 int 类型,但反之则不然)。然后我注意到,如果我使用 + 运算符,一切都会正常工作:
int
有人知道为什么会发生这种情况吗?
float
和
>>> n + m
3.0
>>> m + n
3.0
彼此之间的关系不是很深吗?
__add__
and
+
not deeply related to each other?
你观察到的行为是因为 Python 如何处理不同类型操作数的加法。让我们来分析一下:
-
__add__
和+
你说得对,
+
运算符与
__add__
方法密切相关。当你在表达式
a + b
中使用
+
时,Python 会在内部调用
a.__add__(b)
。
-
浮点数和整数的加法行为
-
当你调用
n.__add__(m)
,其中n
是一个浮点数而m
是一个整数时,Python 的浮点数类型会执行加法并将结果作为浮点数返回,这符合预期。 -
当你调用
m.__add__(n)
,其中m
是一个整数而n
是一个浮点数时,Python 的整数类型并“不知道”如何直接与浮点数相加。它会返回NotImplemented
来表示这一点。 -
+
运算符的魔法
这也就是
+
运算符的亮点所在。当 Python 遇到
m + n
且
m.__add__(n)
返回
NotImplemented
时,它不会就此止步。相反,它会尝试调用
n.__radd__(m)
,即
反向加法
。
-
__radd__
来拯救
浮点数类型实现了
__radd__
方法,该方法实质上与
__add__
方法相同,允许以“反向”顺序进行加法。因此,
m + n
会调用
n.__radd__(m)
,它会按预期返回所需的浮点结果。
总而言之:
Python 的
+
运算符提供了
__add__
和
__radd__
方法之间的巧妙交互,以处理不同数字类型的混合类型算术。这种机制确保了在可能的情况下加法都能正常工作,即使一个操作数没有实现处理另一操作数类型的加法也是如此。
这种行为不仅限于整数和浮点数;它还适用于其他 Python 类型,从而可以实现灵活且一致的混合类型算术运算。
标签:python,floating-point,integer,addition From: 38624450