如何用字符串format函数打印对象表示?Money类需重写哪个方法?
解决方法:重写
__format__方法 嘿,问题出在你没用到正确的方法上!当你把对象传给format()函数(或者用f-string进行格式化)时,Python并不会调用__str__或__repr__,而是会专门调用__format__方法——这才是你需要重写的目标。
为什么__str__和__repr__没生效?
__str__是当你调用str(obj)或者print(obj)时触发的,所以你的print(m)能正常工作;__repr__是在交互式环境直接输入对象名、或者调用repr(obj)时触发的,所以你直接输入m也能看到正确结果;- 但格式化操作(比如
format(m)、f"{m}")有自己的专属接口,就是__format__,所以之前的重写没覆盖到这个场景。
修改后的代码示例
from decimal import Decimal class Money(Decimal): def __str__(self): return "$" + format(self, ',.2f') def __repr__(self): return "$" + format(self, ',.2f') def __format__(self, spec): # 如果没有传入格式化规则,默认使用两位小数的千分位格式 if not spec: spec = ',.2f' # 调用父类Decimal的格式化逻辑,再加上货币符号 return "$" + format(super(), spec)
测试效果
m = Money("123.44") print(format(m)) # 输出: $123.44 print(f"应付金额:{m}") # 输出: 应付金额:$123.44 # 还支持自定义格式化规则 print(format(m, ',.4f')) # 输出: $123.4400
这样不管是直接打印、交互式输出,还是用format()函数或f-string格式化,都能得到带货币符号的正确金额格式了。
内容的提问来源于stack exchange,提问作者Jesus H
相关产品推荐
相关产品推荐

