Python中的super(XX,self).__init__()的作用

在使用Pytorch框架时,需要自己定义网络。super(XX,self).init(),就成了自定义网络结构时必不可少的第一句。

super(XX,self).init()对继承自父类的属性进行初始化,并且用父类的初始化方法初始化继承的属性。

例子:

import torch
import numpy as np
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):
        #对父类的方法进行重写
        print(self.name,self.gender,self.school)

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

结果

Bob female 5th

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

import torch
import numpy as np
class Person():
    def __init__(self,name,gender,age):
        #为name和gender赋值
        self.name = name
        self.gender = gender
        self.age = age

    def printinfo(self):
        print(self.name,self.gender)

#Stu类继承Person类
class Stu(Person):
    def __init__(self,name,gender,age,school,score):
        # 使用父类的初始化方法,初始化name,gender,age属性
        super(Stu,self).__init__(name,gender,age)
        # 对name,gender属性进行改变.age属性仍保持父类的初始化方法
        self.name = name.upper() #姓名改为大写
        self.gender = gender.upper() #性别改为大写
        self.school = school
        self.score = score

    def printinfo(self):
        print(self.name,self.gender,self.age,self.school,self.score)

if __name__=='__main__':
    stu = Stu('Bob','female','18','High school','17')
    stu.printinfo()

输出:

BOB FEMALE 18 High school 17

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

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

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

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

为啥要用父类的方法去初始化属性呢?原因很简单:因为父类的方法已经写好了,我们只需要调用就可以了。

python中创建类后,通常会创建一个__init__()方法,这个方法会在创建类的实例的时候自动执行。

 

博客链接:https://www.jb51.net/article/258207.htm

 

posted @ 2023-03-10 11:21  sqsq  阅读(332)  评论(0编辑  收藏  举报