Python中为何__str__无法正常打印对象列表,而__repr__可以?
为什么打印对象列表时只有__repr__能生效?
这是因为Python对不同场景下的字符串转换逻辑有明确区分:
- 当你直接
print单个对象(比如print(player1))时,Python会调用该对象的__str__方法,这也是为什么你只实现__str__时,单个实例能正常显示自定义内容。 - 但当你打印列表这类容器时,Python会对容器内的每个元素调用
__repr__方法,而不是__str__。如果你的类没有自定义__repr__,就会使用默认的实现——显示对象的类型和内存地址,也就是你看到的<classes.Player object at 0x...>这种格式。
简单总结两者的设计定位:
__str__是给普通用户看的友好输出,用于直接打印单个对象的场景。__repr__是给开发者看的明确描述,用于容器打印、交互式命令行输出等场景,设计初衷是让输出的字符串尽可能能还原出对象(非强制要求)。
对应你的代码场景:
- 实现
__repr__后,列表打印时每个元素都会调用这个自定义方法,所以能得到[N: p1, N: p2, N: p3]的预期结果。 - 只实现
__str__时,列表打印依赖默认__repr__,所以显示对象地址,而单个print调用__str__所以正常显示。
内容的提问来源于stack exchange,提问作者Slappy
相关产品推荐
相关产品推荐

