Hドゥーセ:
私は、その変更するサブクラス化フロートをしました__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
chepner:
継承を使用しないでください。Euro
以下のようなものではないfloat
、とお金を使って表現してはいけませんfloat
Sによる実数の浮動小数点近似値の不正確さにします。
代わりに、使用する組成物は、のようなものを使用して、ユーロの数を表す属性を格納するdecimal.Decimal
ユーロ・アンド・セントを表現するために正確に。
from decimal import Decimal
class Euro:
# In accordance with how to use super properly,
# always accept and pass on unrecognized keyword arguments.
def __init__(self, value, **kwargs):
super().__init__(**kwargs)
self.value = Decimal(value.strip('€'))
def __str__(self):
return f'{self.value} €'