我正在创建一个Money类,我想将对象直接传递给字符串format()函数,并获得带有2位小数和货币符号的货币表示。
我应该用什么方法覆盖字符串格式函数?覆盖 str 和 repr 无效。
DateAdapter
答案 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