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__()}>'
我正在测试 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__()}>'