当我用Python学习课程时。我遇到了如下问题:
class Try_int(int):
def __add__(self, other):
return int(self) + int(other)
class Try_int(int):
def __add__(self, other):
return self + other
第一个给出正确答案。但是第二个给出了无限递归。
为什么会发生此问题?
| __add__(self, value, /)
| Return self+value.
实际上,我通过add
检查了help(int)
。似乎与案例2相同。
答案 0 :(得分:0)
原因如下:
在第一堂课中,您将self
和other
转换为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__ -> ...
,这当然是无限递归。