#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 если мой ответ решил вашу проблему, вы можете принять его, чтобы другие, кто видит этот вопрос, знали, что он работает