__repr__
是 Python 中一个非常重要的魔术方法(Magic Method),也常被称为双下划线方法 (Dunder Method)。它的主要作用是为对象提供一个官方的、明确的、面向开发者的字符串表示形式(Representation)。
简单来说,当你需要用代码的方式来重建或识别一个对象时,你就需要用到 __repr__
。
__repr__
的核心作用
1. 明确的、面向开发者的字符串
__repr__
方法应该返回一个字符串,这个字符串的目标是毫不含糊地描述对象是什么。理想情况下,这个字符串应该是一个有效的 Python 表达式,可以直接用来重建该对象。
- 调用场景:
- 当你在 Python 交互式命令行或 Jupyter Notebook 中直接输入一个变量名时。
- 当你调用内置函数
repr(obj)
时。 - 在调试和日志记录中。
2. 与 __str__
的区别
__repr__
经常与另一个魔术方法 __str__
进行比较,它们的区别是:
特性 | __repr__ (Representation) |
__str__ (String) |
---|---|---|
目标受众 | 开发者(Developer) | 用户(End User) |
用途 | 调试、日志记录,要求明确、无歧义。 | 打印输出,要求可读、友好。 |
理想返回值 | 通常是 <ClassName(attribute1=value1, ...)> 或一个能重建对象的表达式,例如:Linear(784, 512) 。 |
友好的句子,例如:"一个包含 784 个输入的线性层。" |
默认行为 | 如果未定义 __str__ ,print() 函数会退回到调用 __repr__ 。 |
如果未定义,则调用父类的 __str__ 或 __repr__ 。 |
如何在你的类中实现 __repr__
以你的 Linear
类为例,如果实现了 __repr__
,可以大大方便你检查网络结构:
示例代码
class Linear:def __init__(self, in_features, out_features, lr):self.in_features = in_featuresself.out_features = out_featuresself.lr = lr# ... (其他初始化代码)# 实现 __repr__ 魔术方法def __repr__(self):# 返回一个可以重建该对象的字符串return f"Linear(in_features={self.in_features}, out_features={self.out_features}, lr={self.lr})"# 创建对象
layer1 = Linear(784, 512, 0.008)# 打印输出
print(repr(layer1))
print(layer1) # 如果没有定义 __str__,print 也会使用 __repr__
打印输出
Linear(in_features=784, out_features=512, lr=0.008)
Linear(in_features=784, out_features=512, lr=0.008)
通过实现 __repr__
,你在调试时可以清晰地看到这个 Linear
层的输入、输出和学习率,这比看到默认的 <__main__.Linear object at 0x...>
要有用得多。