str(x) / repr(x) 是 Python 解释器提供的内置函数,永远可用,它们内部会去调用对象的方法
__str__ / __repr__ 是你 在类里定义的特殊方法,决定当对象被 str() / repr() 或 print() 时到底输出什么
str() → 给人看(漂亮、简洁)。repr() → 给机器/调试看(尽量能 eval 回来)。__repr__ 或 __str__ → 继承自 object 的这两个方法。“最顶层的默认实现”就是 Python 内置的 object 类里自带的: Python 复制 def __repr__(self): return f'<{self.__class__.__module__}.{self.__class__.__qualname__} object at {hex(id(self))}>' def __str__(self): return self.__repr__() # 如果没有重写 __str__,就直接用 __repr__
print(obj) → 触发 __str__ → 发现没重写 → 退回到 __repr__ → 最终输出<__main__.类名 object at 0x内存地址>。print(m1),m1是某个类对象__str__ 有没有被定义 → 如果有,就调用 str(m1),结果给 print。__str__,就会退而求其次调用 repr(m1),也就是 __repr__。