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

Python魔法方法__str__与__repr__的执行返回顺序咨询

问题解答

函数返回值基础规则

单次函数调用有且仅有一个返回值。函数执行时只要碰到任意一条return语句就会立刻终止当前执行流程,把return后的值抛给调用方,同一次调用里不可能有两条return同时生效。如果函数走完整个流程都没碰到显式return,默认返回None。

__str__与__repr__的执行逻辑

你写的这两个魔法方法不存在“后定义的覆盖前一个”“多个都跑一遍只留一个结果”的情况,二者是完全独立的方法,有明确的触发场景和调用规则,和两个方法的定义顺序没有任何关系:

  • 两个方法的设计目标完全不同:
    • __repr__是给开发者调试用的,返回的内容要尽可能无歧义,理想情况下拿返回的字符串直接执行就能重建出一模一样的对象,就算做不到也要把对象的核心状态信息列全。
    • __str__是给普通用户看的,返回内容优先保证可读性,格式可以更友好,不需要满足可重建对象的要求。
  • 具体调用规则:
    • 用print()打印对象、调用str()做类型转换时,会优先调用__str__拿返回值;如果类里没定义__str__,才会退而求其次调用__repr__。
    • 在交互式解释器里直接输对象名回车输出、调用repr()做类型转换、打印列表/字典这类容器里存的对象时,会直接调用__repr__,根本不会触发__str__。

你可以跑下面这段代码验证:

class Demo:
    def __init__(self, first, second):
        self.first = first
        self.second = second
    def __str__(self):
        return f"[给用户看的] {self.first} {self.second}"
    def __repr__(self):
        return f"[给开发者调试用的] {self.first} {self.second}"

d = Demo("测试1", "测试2")
print(str(d))  # 输出 [给用户看的] 测试1 测试2
print(repr(d)) # 输出 [给开发者调试用的] 测试1 测试2
print([d])     # 输出 [[给开发者调试用的] 测试1 测试2],容器内元素固定走__repr__

所有场景下都只会触发对应场景要求调用的那一个魔法方法,不会两个都执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:03:27