Python __repr__() 方法

Python __repr__() 语法

__repr__() 是 Python 的一个特殊方法(通常称为 “魔法方法” 或 “双下划线方法”), 它用于定义当对象调用 repr() 函数时,或在交互式解释器中直接输入对象时,如何返回一个字符串。

__repr__() 方法的主要作用是返回一个 “官方的”、对开发者友好的字符串表示形式。

语法:

class MyClass:
    def __repr__(self):
        # 返回对象的官方字符串表示
        return value

说明:

__repr__() 方法不接收任何参数,除了 self(实例本身)。

__repr__() 方法必须返回一个字符串。该字符串应该是一个 “正式” 的、清晰无歧义的表示,主要供开发者阅读和调试使用。

如果一个类同时定义了 __str__() 和 __repr__(),那么:

  • 调用 str()print() 时,会优先使用 __str__()。
  • 调用 repr() 和在交互式解释器直接输入对象,会优先使用 __repr__()。

如果一个类只定义了 __repr__() 而没有定义 __str__(),那么调用 str() 或 print() 时会回退到使用 __repr__()。

提示:如果一个类实现了 __repr__() 方法,那么当对该类的实例调用 repr() 函数或在交互式解释器中直接输入对象时,Python 会自动调用这个方法。

Python __repr__() 摘要

属于 Python 魔法方法
使用频率
官方文档 查看
相关方法 __str__()

Python __repr__() 示例

接下来,我们通过几个简单的例子来讲解一下 Python __repr__() 方法是如何使用的。

示例 1:__repr__() 的基本用法

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

    def __repr__(self):
        # 返回开发者友好的表示,理想情况下可用于重新创建对象
        return f'Coordinate(x={self.x}, y={self.y})'

# 创建 Coordinate 实例
coord1 = Coordinate(10, 20)
coord2 = Coordinate(-5, 15)

# 使用 repr() 函数
print(repr(coord1))
print(repr(coord2))

# 在容器中显示对象时,通常使用 __repr__()
my_coords = [coord1, coord2, Coordinate(0, 0)]
print(my_coords)

运行结果如下。

Coordinate(x=10, y=20)
Coordinate(x=-5, y=15)
[Coordinate(x=10, y=20), Coordinate(x=-5, y=15), Coordinate(x=0, y=0)]

分析:

在 Coordinate 类中,我们自定义实现了 __repr__() 方法。该方法内部返回了一个字符串,用于展示对象的类型和其关键属性的值。

当调用 repr(coord1) 以及打印列表 my_coords 时,会自动使用 __repr__() 的结果。这种字符串表示的结果,有助于我们在调试时快速了解对象的状态。

示例 2:__repr__() 和 __str__() 同时存在

class User:
    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        # 开发者友好表示,包含所有足以识别对象的细节
        return f'User(username=\'{self.username}\', email=\'{self.email}\')'

    def __str__(self):
        # 用户友好表示,简洁明了
        return f'用户: {self.username}, <{self.email}>'

# 创建 User 类的实例
user = User('alice', 'alice@example.com')

# 使用 repr()时,会调用 __repr__()
print(repr(user))

# 使用 print() 或 str() 时,会优先调用 __str__()
print(str(user))
print(user)

运行结果如下。

User(username='alice', email='alice@example.com')
用户: alice, <alice@example.com>
用户: alice, <alice@example.com>

分析:

在 User 类中,我们同时定义了 __repr__() 和 __str__()。当我们调用 repr(user) 时,会自动调用 __repr__()。而当我们使用 str(u1) 或 print(u1) 时,则会调用 __str__()。

__repr__() 主要用于方便开发者调试,而 __str__() 主要用于向用户展示。

示例 3:没有实现 __repr__() 方法

class MyObject:
    def __init__(self, id):
        self.id = id
        self.data = [1, 2, 3]    # 复杂一点的内部数据

# 创建 MyObject 类的实例
obj = MyObject(123)

# 打印对象时,会使用默认形式
print(obj)

# 使用 repr() 函数,也会使用默认形式
print(repr(obj))

运行结果如下。

<__main__.MyObject object at 0x000001E94F636E40>
<__main__.MyObject object at 0x000001E94F636E40>

分析:

在这个例子中,MyObject 类没有实现 __repr__() 或 __str__()。因此,无论是调用 print() 还是 repr(),都会得到 Python 默认的对象表示,也就是 “<__main__.SimpleObject object at 0x…>” 这种形式。

这种表示只包含了类名和对象的内存地址,对开发者来说缺乏直观的信息,不便于我们理解对象的状态和调试。因此,强烈建议为自定义类实现 __repr__() 方法。

上一篇: __str__()

下一篇: __bytes__()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号