无法理解__add__函数中的某些错误

时间:2019-03-23 01:56:22

标签: python operator-overloading

当我用Python学习课程时。我遇到了如下问题:

    1。
class Try_int(int):
    def __add__(self, other):
        return int(self) + int(other)
    2。
class Try_int(int):
    def __add__(self, other):
        return self + other

第一个给出正确答案。但是第二个给出了无限递归。

为什么会发生此问题?

|  __add__(self, value, /)
|      Return self+value.

实际上,我通过add检查了help(int)。似乎与案例2相同。

1 个答案:

答案 0 :(得分:0)

原因如下:

在第一堂课中,您将selfother转换为int。这意味着self + other代表  int.__add__(self, other)。请注意,当您调用dir(int)时,得到的只是文档,而不是该方法的实际实现,该实现在C中。

因此,方法调用链为:

Try_int.__add__ -> int.__add__int.__add__不是递归的。

但是,在第二堂课中,您没有对self执行任何转换。这意味着当您尝试执行self + other时,Python将寻找为__add__定义的self方法。但是,它是在您调用它的确切位置定义的!这导致以下方法调用链:

Try_int.__add__ -> Try_int.__add__ -> Try_int.__add__ -> ...,这当然是无限递归。