__repr__魔术方法

__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_features
        self.out_features = out_features
        self.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...> 要有用得多。

posted @ 2025-09-25 14:17  李大嘟嘟  阅读(12)  评论(0)    收藏  举报