首页 > 解决方案 > 在 python 中打印某个类的对象时会打印什么?

问题描述

我想问一下这个具体的例子,取自官方的pytorch教程

import torch
import torch.nn as nn
import torch.nn.functional as F


class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        # 1 input image channel, 6 output channels, 3x3 square convolution
        # kernel
        self.conv1 = nn.Conv2d(1, 6, 3)
        self.conv2 = nn.Conv2d(6, 16, 3)
        # an affine operation: y = Wx + b
        self.fc1 = nn.Linear(16 * 6 * 6, 120)  # 6*6 from image dimension
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

net = Net()
print(net)

输出是

Net(
  (conv1): Conv2d(1, 6, kernel_size=(3, 3), stride=(1, 1))
  (conv2): Conv2d(6, 16, kernel_size=(3, 3), stride=(1, 1))
  (fc1): Linear(in_features=576, out_features=120, bias=True)
  (fc2): Linear(in_features=120, out_features=84, bias=True)
  (fc3): Linear(in_features=84, out_features=10, bias=True)
)

据我了解,此代码定义了 的子类Netnn.Module并在其初始化程序中定义了成员conv1conv2等。这些成员在print(net)被调用时打印。基于这种观察,我认为如果我将这一行添加self.x = 0到 的初始化程序中Net,将会有一行额外的输出,例如:(x): 0. 但那并没有发生。Net那么谁来决定打印哪一部分呢?

标签: pythonclasspytorch

解决方案


来自Python3 文档

repr(object)
返回一个包含对象的可打印表示的字符串。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给 eval() 时会产生具有相同值的对象,否则表示是一个包含在尖括号中的字符串,其中包含对象类型的名称附加信息通常包括对象的名称和地址。类可以通过定义 __repr__() 方法来控制此函数为其实例返回的内容。

由于您的类继承了 nn.Module 类,因此它使用其repr 方法


推荐阅读