Python __repr__() 语法
__repr__() 是 Python 的一个特殊方法(通常称为 “魔法方法” 或 “双下划线方法”), 它用于定义当对象调用 repr() 函数时,或在交互式解释器中直接输入对象时,如何返回一个字符串。
__repr__() 方法的主要作用是返回一个 “官方的”、对开发者友好的字符串表示形式。
语法:
class MyClass:
def __repr__(self):
# 返回对象的官方字符串表示
return value
说明:
__repr__() 方法不接收任何参数,除了 self(实例本身)。
__repr__() 方法必须返回一个字符串。该字符串应该是一个 “正式” 的、清晰无歧义的表示,主要供开发者阅读和调试使用。
如果一个类同时定义了 __str__() 和 __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__() 方法。
