Ошибка рекурсии Python при наследовании от float и вызове str и repr

#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__()