为何打印整个Python字典时未调用自定义对象的__str__方法?
为什么打印字典时不会调用自定义对象的__str__方法?
这个问题的核心在于Python中__str__和__repr__这两个方法的分工,以及容器对象(比如字典)生成字符串表示的逻辑:
单个对象打印 vs 容器对象打印的区别
当你直接执行print(my_dict['1'])时,Python会调用该对象的__str__方法——这个方法的设计目的就是返回用户友好的可读性字符串,所以你能看到自定义的格式化输出。
但当你打印字典这类容器时,字典在构建自己的字符串表示时,会调用容器内每个元素的__repr__方法,而不是__str__。__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
相关产品推荐
相关产品推荐

