python - 在 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)
)
据我了解,此代码定义了 的子类Net
,nn.Module
并在其初始化程序中定义了成员conv1
、conv2
等。这些成员在print(net)
被调用时打印。基于这种观察,我认为如果我将这一行添加self.x = 0
到 的初始化程序中Net
,将会有一行额外的输出,例如:(x): 0
. 但那并没有发生。Net
那么谁来决定打印哪一部分呢?
解决方案
repr(object)
返回一个包含对象的可打印表示的字符串。对于许多类型,此函数尝试返回一个字符串,该字符串在传递给 eval() 时会产生具有相同值的对象,否则表示是一个包含在尖括号中的字符串,其中包含对象类型的名称附加信息通常包括对象的名称和地址。类可以通过定义 __repr__() 方法来控制此函数为其实例返回的内容。
由于您的类继承了 nn.Module 类,因此它使用其repr 方法
推荐阅读
- javascript - 测试 onChange 处理程序时,React State 变得未定义
- firebase - 如何在firebase中动态创建cron作业
- spring-boot - SpringBootTest时如何忽略ContextRefreshedEvent?
- java - 可选的 map 和 orElse 必须返回相同的类型
- r - 在 R 中制作具有多列的数据透视表
- java - 在 Eclipse 链接 jpa 中移动到 java 8 时间后,derby 数据库中的错误
- jmeter - 在 1 个测试计划中执行许多测试
- r - 列 R 中有多个字符串的条件
- excel - 打开具有特定名称模式的不同文件夹和工作表?
- python - 从 xlsx 导入到 pandas 时带有“无”标题的列