#python #string #inheritance #repr
Вопрос:
Я тестировал некоторые функции в Python для развлечения 😉 Но у меня есть ошибка рекурсии, которую я не понимаю
class Test(float):
def __new__(cls, value):
return super().__new__(cls, value)
def __str__(self):
return super().__str__()
def __repr__(self):
return f'<value: {str(self)}>'
test = Test(12)
test
return super().__str__()
должен позвонить float.__str__()
и просто возвращает «12»
У тебя есть какие-нибудь идеи ?
Комментарии:
1. Пожалуйста, опубликуйте полный отчет об ошибках!
2. Ваш repr вызывает str, который вызывает str float, который переходит к repr, что является бесконечной рекурсией. Вы могли бы вызвать
super().__repr__
свой метод repr вместо вызоваstr(self)
Ответ №1:
Ваш __repr__
вызывает ваш __str__
, который вызывает супер __str__
, который подчиняется repr
, который вызывает ваш __repr__
, что является бесконечной рекурсией. Вы могли бы вызвать super().__repr__
свой __repr__
метод вместо вызова str(self)
.
class Test(float):
def __new__(cls, value):
return super().__new__(cls, value)
def __str__(self):
return super().__str__()
def __repr__(self):
return f'<value: {super().__repr__()}>'
>>> Test(12)
<value: 12.0>
Ответ №2:
Основная проблема заключается в том, что float.__str__(self)
будет звонить self.__repr__()
, а не float.__repr__(self)
.
Это не только означает , что у вас есть бесконечная рекурсия от Test.__repr__
до Test.__str__
до float.__str__
обратно Test.__repr__
, это означает, что Test.__str__
будет напечатано то же самое Test.__repr__
, что, как я предполагаю, вам не нужно, так как вы приложили усилия для ее повторного использования.
Вместо этого я думаю, что ты хочешь:
class Test(float):
def __str__(self):
return super().__repr__()
def __repr__(self):
return f'<value: {super().__repr__()}>'
Комментарии:
1. спасибо, я думал, что float.__str__(self) вызовет float.__repr__(self) , но он вызывает self.__repr__()