Python的子类会继承父类的类属性和类方法,包括构造方法。并且,当一个子类继承多个父类的构造方法的时候,会优先选择排在最前面的父类中的实例方法。
举例
class People:
def __init__(self,name):
self.name = name
def say(self):
print("我是人,名字为:",self.name)
class Animal:
def __init__(self,food):
self.food = food
def display(self):
print("我是动物,我吃",self.food)
#People中的 name 属性和 say() 会遮蔽 Animal 类中的
class Person(People, Animal):
pass
per = Person("zhangsan")
per.say()
#per.display()
运行结果
我是人,名字为:zhangsan
但是如果想执行per.display()
就会报错
File “super_demo.py”, line 20, in display
print(“我是动物,我吃”, self.food)
AttributeError: ‘Person’ object has no attribute ‘food’。
原因是:Person首先继承的是People的构造方法,并没有继承Animal的构造方法,所以在执行
print(“我是动物,我吃”,self.food)的过程中,显示找不到self.food这个属性。
反之,class Person(People, Animal) 如果改成 class Person( Animal, People),那么per.say()就会报错。
如果想避免上面的问题,就需要自定义Person的构造方法。
这个构造方法有几个方式,在下面例子中可见
class Person(People, Animal):
#自定义构造方法
def __init__(self,name,food):
#调用 People 类的构造方法
super().__init__(name) #默认执行第一个父类People的构造函数
#super(Person,self).__init__(name) #执行效果和上一行相同
#People.__init__(self,name)#使用未绑定方法调用People 类构造方法,执行效果和上一行相同
#调用其它父类的构造方法,需手动给 self 传值
Animal.__init__(self,food)
per = Person("zhangsan","土豆")
per.say()
per.display()
运行结果
我是人,名字为:zhangsan
我是动物,我吃 熟食
回到本文开头
Abcnet(nn.Module):
def __init__(self, in_channels, out_channels, xxxx xxxx):
super().__init__()
#super(nn.Module).__init__() #等同于上一行