Не могу понять некоторые ошибки в __add__ функциях

#python #operator-overloading

#python #оператор-перегрузка

Вопрос:

Когда я изучаю класс на 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 by help(int) . Похоже, это то же самое, что и в случае 2.

Ответ №1:

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

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

Комментарии:

1. @FanYe если мой ответ решил вашу проблему, вы можете принять его, чтобы другие, кто видит этот вопрос, знали, что он работает