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