__str__ __repr__ 是 Python 中两个非常重要的魔法方法,它们都用于定义对象的字符串表示,但各自的使用场景和目标有所不同。

1. __str__:面向用户的字符串表示

  • 目的:__str__ 主要用于为对象提供一个友好的、易于理解的字符串表示,通常是面向终端用户或者外部系统的输出。
  • 用途:当你使用 print() 函数或者 str() 函数时,Python 会调用对象的 __str__ 方法。它应该返回一个简洁、直观且易于阅读的字符串。

代码示例:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Point at ({self.x}, {self.y})"

p = Point(3, 4)
print(p)

代码输出:

Point at (3, 4)

2. __repr__ :面向开发者的字符串表示

  • 目的:__repr__ 的主要目的是为开发者提供一种无歧义的、尽可能详细的字符串表示,以便于调试和开发。它应该尽量返回一个能够重新构建该对象的字符串(或至少能够描述该对象)。
  • 用途:__repr__ 通常用于调试、日志记录、交互式环境(如 Python shell),以及当你打印对象时,Python 会自动调用该方法。如果未定义 __str__ 方法,__repr__ 会被用作 print() 输出的后备方法。

代码示例:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

p = Point(3, 4)
print(repr(p))

代码输出:

Point(x=3, y=4)

3. __str__ vs __repr__:区别

特性 __str__ __repr__
目标 面向终端用户,简洁、友好、易读 面向开发者,详细、无歧义、可重建对象
输出格式 通常为简单的字符串描述,易于理解 返回尽可能完整的对象信息,通常包括类名和参数
用途 主要用于 print()str() 输出 主要用于调试、交互式环境、日志记录
默认行为 如果没有定义 __str__,Python 会调用 __repr__ 如果没有定义 __repr__,Python 会调用默认的 __repr__,该默认方法返回一个类似 <__main__.ClassName object at 0x000000> 的表示

4. 综合示例

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return f"Point at ({self.x}, {self.y})"

    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

# 创建一个 Point 对象
p = Point(3, 4)

# 面向用户的字符串表示
print(str(p))  # Output: Point at (3, 4)

# 面向开发者的字符串表示
print(repr(p))  # Output: Point(x=3, y=4)

总结

  • __str__ 是用户友好的输出,返回一个易于理解的字符串
  • __repr__ 是开发者友好的输出,返回一个更详细的、能够重建对象的字符串
  • 如果 __str__ 没有定义,Python 会回退到使用 __repr__
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐