Python - 从 float 继承并调用 str 和 repr 时出现递归错误

Python - recursion error when inherit from float and call str and 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__() 并且只是 returns '12'

你有什么想法吗?

你的 __repr__ 调用你的 __str__,它调用超级的 __str__,它服从 repr,它调用你的 __repr__,这是一个无限递归。您可以在 __repr__ 方法中调用 super().__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>

核心问题是 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__()}>'