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

为何打印整个Python字典时未调用自定义对象的__str__方法?

为什么打印字典时不会调用自定义对象的__str__方法?

这个问题的核心在于Python中__str__和__repr__这两个方法的分工,以及容器对象(比如字典)生成字符串表示的逻辑:

  1. 单个对象打印 vs 容器对象打印的区别
    当你直接执行print(my_dict['1'])时,Python会调用该对象的__str__方法——这个方法的设计目的就是返回用户友好的可读性字符串,所以你能看到自定义的格式化输出。
    但当你打印字典这类容器时,字典在构建自己的字符串表示时,会调用容器内每个元素的__repr__方法,而不是__str__。

  2. __str__和__repr__的本质差异

    • __str__:面向普通用户,输出简洁易懂的内容,方便阅读。
    • __repr__:面向开发者,输出的字符串应该尽可能准确地描述对象的“本质”,默认实现就是显示类名和内存地址(也就是你看到的<__main__.MyObj object at 0x...>),目的是让开发者能快速识别对象类型和身份。

解决方法

如果你想让打印字典时也显示自定义的对象内容,有两种常用方式:

方式一:给MyObj添加__repr__方法

直接复用__str__的实现,让__repr__返回和__str__一样的内容,这样不管是直接打印对象还是在字典中打印,都会显示你想要的格式:

class MyObj:
    def __init__(self):
        self.title = ''
        self.num = 0
        self.name = ''
    def __str__(self):
        return 'title:' + self.title \
               + ', num:' + str(self.num) \
               + ', name:' + self.name
    def __repr__(self):
        return self.__str__()  # 复用__str__的格式化逻辑

方式二:手动遍历字典打印

如果你不想修改类的定义,可以手动遍历字典的键值对,逐个打印每个对象,这样每个对象都会触发__str__方法:

for key, obj in my_dict.items():
    print(f"{key}: {obj}")

简单总结一下:容器对象默认用__repr__来展示元素,是为了给开发者提供更“硬核”的调试信息;如果想要友好展示,要么给类补全__repr__,要么手动处理打印逻辑。

内容的提问来源于stack exchange,提问作者BeJay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:27:28