终于搞懂了 super(XXXX, self).__init__()的作用是啥了

这篇具有很好参考价值的文章主要介绍了终于搞懂了 super(XXXX, self).__init__()的作用是啥了。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在使用pytorch框架时,难免要自己定义网络。于是,super(XXXX, self).init(),就成了自定义网络结构时必不可少的第一句。但是,super(XXXX, self).init()具体的作用是什么我一直没有搞清楚。阅读了大量的博客后,我终于搞懂了!
一言以蔽之:super(XXX, self).init()——对继承自父类的属性进行初始化,并且用父类的初始化方法初始化继承的属性。
我们先看一个简单的例子:

class Person():
    def __init__(self, name, gender):
    	# 为name和gender赋值 
        self.name = name
        self.gender = gender
        
    def printinfo(self):
    
        print(self.name, self.gender)


# Stu类继承Person类        

class Stu(Person):
    def __init__(self, name, gender, school):
    
        # 使用父类的初始化方法来初始化子类name和gender属性
        super(Stu, self).__init__(name, gender)  
        
        self.school = school
        
    def printinfo(self):   
    	# 对父类的printinfo方法进行重写
       
        print(self.name, self.gender, self.school) 


    
if __name__=='__main__':
    stu = Stu('Bob', 'female', '5th')
    stu.printinfo()

>>>
Bob female 5th

当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。比如:

class Person(object):
    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age
        
# Student类继承Person类
class Student(Person):
    def __init__(self, name, gender, age, school, score):
    
    	# 调用父类的初始化方法,初始化name、gender、age属性
        super(Student, self).__init__(name,gender, age)
        
        # 对name、gender属性进行改写。age属性仍保持父类的初始化方法
        
        self.name = name.upper()  # 姓名改为大写
        self.gender = gender.upper()  # 性别改为大写
        self.school = school
        self.score = score
        
s = Student("Alice", "female", "18", "High school", "17")
print(s.name, s.gender, s.school, s.score)

>>>
ALICE FEMALE High school 17

在理解了上面的小例子后,我们再仔细研究一下机器学习中的代码:

class Net(nn.Module): # 继承自nn.Moudle

    def __init__(self):
    
        super(Net, self).__init__()
        # 输入图像channel:1;输出channel:6;5x5卷积核
        self.conv1 = nn.Conv2d(1, 6, 5)

super(Net, self).init()的含义:子类Net类继承父类nn.Module,super(Net, self).init()就是对继承自父类nn.Module的属性进行初始化。并且是用nn.Module的初始化方法来初始化继承的属性。


也就是:用父类的方法初始化子类的属性。

有的人肯定会问,为啥要用父类的方法去初始化属性呢?原因很简单:就是因为父类的方法已经写好了,我们只需要调用就可以了。难道你还想自己写一堆代码去初始化各种权重和参数,处理一堆forward和backward的逻辑吗?


最后,多一句嘴,介绍一写在python中__init()的作用
在python中创建类后,通常会创建一个
init__ ()方法,这个方法会在创建类的实例的时候自动执行

实例1:【实例化Bob这个对象的时候, __ init__ ()方法会自动执行】:
在下面的示例中,我们在实例化Bob这个对象的时候, __ init__ ()方法就已经自动执行了,如果不是__ init__ ()方法,比如说eat()方法,那就只有在调用时才会执行。

class Person():
    def __init__(self):
        print("是一个人")
    def eat(self):
        print("要吃饭")
        
Bob = Person()

>>>
是一个人


【实例2】哪些需放入__ init__ ()方法中,哪些不需要???

需要在 __ init__ ()方法中定义:希望有一些操作是在创建实例的时候就自动创建的。在神经网络代码中,一些网络结构的设置,也最好放在 __ init__ ()方法中。

在下述代码中,我们把money这个属性也定义在__ init__ ()方法中,这样就不需要在执行eat()方法后再执行qian()方法。文章来源地址https://www.toymoban.com/news/detail-401101.html

class Person():
    def __init__(self, name,money):
        print("是一个人")
        self.name = name
        self.money = money

    def eat(self):
        print("%s要吃饭" % self.name)

    def qian(self):
        print("花了%s元" % self.money)


Bob = Person("Bob",12)
Bob.eat()
Bob.qian()

>>>
是一个人
Bob要吃饭
花了12

到了这里,关于终于搞懂了 super(XXXX, self).__init__()的作用是啥了的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 今天,我终于学懂了C++中的引用

    本篇博客全站热榜排名:2 Hello,大家好,今天我们就来聊聊有关C++中的引用知识📖 回忆一下我们曾经在写C语言的时候因为指针所引发的种种难题,特别是对于【两数交换】的时候因为函数内部的概念不会引发外部的变化,使得我们 需要传入两个需要交换数的地址 ,在函数

    2023年04月08日
    浏览(69)
  • 【设计模式】我终于读懂了迭代器模式。。。

    编写程序展示一个学校院系结构:需求是这样 要在一个页面中展示出学校的院系组成, 一个学校有多个学院, 一个学院有多个系。 如图: 将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的 实际上我们的要求是 :在一个页面中展示出学

    2024年02月02日
    浏览(36)
  • 【设计模式】我终于读懂了观察者模式。。。

    气象站可以将每天测量到的温度,湿度,气压等等以公告的形式发布出去(比如发布到自己的网站或第三方)。 需要设计开放型 API,便于其他第三方也能接入气象站获取数据。 提供温度、气压和湿度的接口 测量数据更新时,要能实时的通知给第三方 传统的设计方案 CurrentCon

    2024年02月06日
    浏览(39)
  • 涨知识!芯片是怎么做出来的,今天终于看懂了

    从专业角度来说,一块芯片的制作工艺,制作流程极其复杂繁琐。但就从IC完整的产业链来说,主要分为IC设计→IC制造→封装→测试四个部分。 芯片制作过程: 一、芯片设计 芯片属于体积小,但高精密度极大的产品。想要制作芯片,设计是第一环节。设计需要借助EDA工具和

    2023年04月08日
    浏览(40)
  • 论文阅读 Self-Supervised Burst Super-Resolution

    这是一篇 ICCV 2023 的文章,主要介绍的是用自监督的方式进行多帧超分的学习 Abstract 这篇文章介绍了一种基于自监督的学习方式来进行多帧超分的任务,这种方法只需要原始的带噪的低分辨率的图。它不需要利用模拟退化的方法来构造数据,而且模拟退化的方法又可能存在域

    2024年01月18日
    浏览(53)
  • 【数据结构篇】-树(共计两万字,你真的搞懂了它吗)

    友情链接:C/C++系列系统学习目录 (一)树的定义 之前我们一直在谈的是一对一的线性结构,可现实中,还有很多一对多的情况需要处理,所以我们需要研究这种一对多的数据结构——“树” 树:树是由n(n=0)个有限结点组成一个具有层次关系的集合。当n = 0时,称为空树

    2023年04月08日
    浏览(36)
  • Python语法:def __init__(self, value) -> None:

      在一些Python的工程项目中,我们会看到函数参数中会有冒号,有的函数后面会跟着一个箭头,你可能会疑惑,这些都是什么东西? 其实 函数参数中的冒号是参数的类型建议符,告诉程序员希望传入的实参的类型 。 函数后面跟着的箭头是函数返回值的 类型建议符**,用来说

    2024年02月14日
    浏览(40)
  • 终于搞懂动态代理了!

    学习动态代理之前我们需要一些前置知识点: 学一点关于JVM类加载的知识 Java反射,看完就会用 然后我们从设计模式中的代理模式开始说。 代理模式中有3个角色: •  Subject抽象角色 :负责定义RealSubject和Proxy应该实现的接口。 •  RealSubject真实角色 :真正完成业务服务功

    2024年02月03日
    浏览(41)
  • JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)

            注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示.....    目录 基本介绍 过滤器原理 过滤器(Filter)接口 使用过滤器(Filter) 创建过滤器(Fliter) 使用过滤器(Filter) 配置过滤器(Filter)拦截路径  注解方式

    2024年02月02日
    浏览(37)
  • python教程:__new__ 和 __init__及cls和self

    两者的区别: __new__ 是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法。 __init__ 是当实例对象创建完成后被调用的,然后设置对象属性的一些初始值,通常用在初始化一个类实例的时候。是一个实例方法。 也就是: __new__ 先被调用

    2024年01月18日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包