文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-04-02 19:55

关注

在使用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()方法。

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元

到此这篇关于终于搞懂了Python中super(XXXX, self).__init__()的作用了的文章就介绍到这了,更多相关Python super(XXXX, self).__init__()内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯