ALTER摂取と__str__行動にフロートサブクラス

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、とお金を使って表現してはいけませんfloatSによる実数の浮動小数点近似値の不正確さにします。

代わりに、使用する組成物は、のようなものを使用して、ユーロの数を表す属性を格納する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} €'

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=5123&siteId=1