如何使用字符串格式函数打印对象的表示?

时间:2018-04-07 18:13:32

标签: python python-3.x string-formatting

我正在创建一个Money类,我想将对象直接传递给字符串format()函数,并获得带有2位小数和货币符号的货币表示。

我应该用什么方法覆盖字符串格式函数?覆盖 str repr 无效。

DateAdapter

1 个答案:

答案 0 :(得分:9)

你可以给你的班级__format__ method;在这种情况下,只需调用覆盖版本:

def __format__(self, spec):
    spec = spec or ',.2f'  # set a default spec when not explicitly given
    return '$' + super().__format__(spec)

来自链接文档:

  

format()内置函数调用,并通过扩展,评估格式化字符串文字和str.format()方法,以生成对象的“格式化”字符串表示。 format_spec参数是一个字符串,其中包含所需格式选项的说明。 format_spec参数的解释取决于实现__format__()的类型,但是大多数类会将格式化委托给其中一个内置类型,或者使用类似的格式化选项语法。

您现在要放弃__str____repr__实施,或者至少不要在'$'现在添加__format__之前添加另一个format(self, ...)。 {1}}将触发)。

演示:

>>> from decimal import Decimal
>>> class Money(Decimal):
...     def __format__(self, spec):
...         spec = spec or ',.2f'  # set a default spec when not explicitly given
...         return '$' + super().__format__(spec)
...
>>> m = Money("123.44")
>>> print("Amount: {0}".format(m))
Amount: $123.44
>>> print(f"Amount: {m}")
Amount: $123.44