Причина в следующем:
В первом классе вы конвертируете 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__ -> ...
, что, конечно, является бесконечной рекурсией.