我将float细分为更改其__str__()
方法,使其以符号结尾(在我的情况下为€)。
[输入经过过滤以删除符号(在我的情况下为€)。
class Euro(float):
def __new__(cls, value):
v = ''.join([_ for _ in value if _ != '€' ])
return super(Euro, cls).__new__(cls, v)
def __str__(self):
return f'{self} €'
但是当我打印时,出现了递归打印错误。
g = Euro('123.23 €')
print (g)
错误:
Euro.py, line __str__
return f'{self} €'
[Previous line repeated 329 more times]
RecursionError: maximum recursion depth exceeded
使用super()
调用父级的方法并避免递归错误。
def __str__(self):
return super().__str__() + ' €'
>>> g = Euro('123.23 €')
>>> print(g)
123.23 €
考虑代码,
def __str__(self):
return f'{self} €'
[现在,当您调用print(g)
时,实际发生的是print(g)
调用了__str__
的Euro
方法,该方法返回了f'{self} €'
,因为self
引用了Euro
本身的实例,这导致对__str__
的Euro
方法的进一步调用,此递归一直持续到stackoverflow发生。
要解决此问题,您必须确保不应该进行递归,可以通过以下方式实现,
class Euro(float):
def __new__(self, value):
self.value = "".join([_ for _ in value if _ != '€' and _ != " " ])
return float.__new__(self, self.value)
def __str__(self):
return f'{self.value} €' # or return super().__str__() + ' €'
现在调用时,print(g)
这将返回,123.23 €
如预期。
希望这会有所帮助!