pytorch构建模块时常常会看到
class ConvBlock(torch.nn.Module):
def __init__(self, filters, s, f):
super(ConvBlock, self).__init__()
为什么在构造新模块的时候必须super,不然会发生什么?
一句话:重写子类的__init__后不再自动继承父类的__init__,必须使用super把父类的拿过来
例子A:子类不重写__init__
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.bodyTemperature = 36.5
class Female(Person):
pass
femaleA = Female('Emma', 18)
print(femaleA.name, femaleA.age, femaleA.bodyTemperature)
这时候会执行父类的构造函数,返回正确的属性
例子B:子类重写__init__不super
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.bodyTemperature = 36.5
class Female(Person):
def __init__(self, name, age, height):
self.height = height
femaleA = Female('Emma', 18, 175)
print(femaleA.name, femaleA.age, femaleA.bodyTemperature, femaleA.height)
会报错,因为Female类只需要一个height输入,没有继承父类的构造属性,即使把父类属性加入__init__()也没用
例子C:子类重写__init__并super
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
self.bodyTemperature = 36.5
class Female(Person):
def __init__(self, name, age, height):
super(Female, self).__init__(name, age)
self.height = height
femaleA = Female('Emma', 18, 175)
print(dir(femaleA))
一切正常