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
相关产品推荐
相关产品推荐

