Не могу понять некоторые ошибки в функциях __add__ - PullRequest
0 голосов
/ 23 марта 2019

Когда я изучаю класс в 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.

1 Ответ

0 голосов
/ 23 марта 2019

Причина в следующем:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...