御笔剑客 发表于 2020-3-18 08:55:06

关于super方法的一个问题

在pytorch中定义一个神经网络模型:
import torch

class MyNet(torch.nn.Module):
    def __init__(self):
      super(MyNet, self).__init__()# 第一句话,调用父类的构造函数
      self.conv1 = torch.nn.Conv2d(3, 32, 3, 1, 1)
      self.relu1=torch.nn.ReLU()
      self.max_pooling1=torch.nn.MaxPool2d(2,1)

      self.conv2 = torch.nn.Conv2d(3, 32, 3, 1, 1)
      self.relu2=torch.nn.ReLU()
      self.max_pooling2=torch.nn.MaxPool2d(2,1)

      self.dense1 = torch.nn.Linear(32 * 3 * 3, 128)
      self.dense2 = torch.nn.Linear(128, 10)



为什么要用这一句呢:   super(MyNet, self).__init__(),我输出的继承层级关系只有一层:
,super不是多继承的时候用的吗?求dalao指点一下

sunrise085 发表于 2020-3-18 09:00:24

本帖最后由 sunrise085 于 2020-3-18 09:03 编辑

在初始化类对象的时候若需要调用父类的初始化函数,则需要使用super函数,这与几层继承没有关系,只有一层继承关系,需要调用父类初始化函数时也需要调用super

你所谓的多继承时调用super,可能有误解,看看这个帖子的多继承初始化。

御笔剑客 发表于 2020-3-18 09:14:42

sunrise085 发表于 2020-3-18 09:00
在初始化类对象的时候若需要调用父类的初始化函数,则需要使用super函数,这与几层继承没有关系,只有一层 ...

但是如果调用父类的构造函数不是应该用super(参数).__init__(),这里的super是当前类

sunrise085 发表于 2020-3-18 09:28:15

御笔剑客 发表于 2020-3-18 09:14
但是如果调用父类的构造函数不是应该用super(参数).__init__(),这里的super是当前类

你这里只有一层继承关系,super的参数可以写也可以不写,但是写的话就写当前类,不能写父类名。这个涉及到__mro__列表的使用。__mro__列表主要是在多继承的情况下使用的。但是也适用于你这种一层继承关系。你看一下我给你的连接,那个帖子中我有一些说明,或许能解释你的疑惑。

永恒的蓝色梦想 发表于 2020-3-18 09:42:25

super是单继承和多继承都可以用吧

御笔剑客 发表于 2020-3-18 10:22:44

sunrise085 发表于 2020-3-18 09:00
在初始化类对象的时候若需要调用父类的初始化函数,则需要使用super函数,这与几层继承没有关系,只有一层 ...

懂了,谢谢dalao

珂乔乔 发表于 2020-3-18 11:27:27

看不懂,学习一下

winsome8538 发表于 2020-3-18 11:58:49

学习了   有用

依可儿 发表于 2020-3-27 11:33:52

难道super不是单继承和多继承都可以用吗。。。

乔珂珂 发表于 2020-3-27 11:38:58

还没学到,学习一下~
页: [1]
查看完整版本: 关于super方法的一个问题