You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用字符串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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:54:34