示例:xxxClass.init(self)继承
class BaseClass(object):
def __init__(self):
print("构造 BaseClass")
class MyClass1(BaseClass):
def __init__(self):
BaseClass.__init__(self)
print("构造 MyClass1")
class MyClass2(BaseClass):
def __init__(self):
BaseClass.__init__(self)
print("构造 MyClass2")
class SubClass(MyClass1, MyClass2):
def __init__(self):
print("子类构造 MyClass1:")
MyClass1.__init__(self)
print("子类构造 MyClass2:")
MyClass2.__init__(self)
sub_class = SubClass()
效果:
子类构造 MyClass1:
构造 BaseClass
构造 MyClass1
子类构造 MyClass2:
构造 BaseClass
构造 MyClass2
可以看到子类会按部就班的依次继承,在构造MyClass1的时候
示例:super().init()
class BaseClass(object):
def __init__(self):
print("构造 BaseClass")
class MyClass1(BaseClass):
def __init__(self):
super().__init__()
print("构造 MyClass1")
class MyClass2(BaseClass):
def __init__(self):
super().__init__()
print("构造 MyClass2")
class SubClass(MyClass1, MyClass2):
def __init__(self):
print("子类构造 MyClass1:")
super().__init__()
print("子类构造 MyClass2:")
super().__init__()
sub_class = SubClass()
效果:
子类构造 MyClass1:
构造 BaseClass
构造 MyClass2
构造 MyClass1
子类构造 MyClass2:
构造 BaseClass
构造 MyClass2
构造 MyClass1
可以看到:super().__init__()
也是可以满足继承的,但是我们调试的时候会发现,运行顺序是:
SubClass
的__init()__
MyClass1
的__init()__
MyClass2
的__init()__
BaseClass
的print("构造 BaseClass")
- (看第3步)
MyClass2
的print("构造 MyClass2")
- (看第2步)
MyClass1
的print("构造 MyClass1")
- (看第1步)
SubClass
的后续操作:print("子类构造 MyClass2:")
两者的区别
所以两者都是会调用父类的方法,区别在于:
xxxClass.__init__(self)
会调用一次父类的__init(self)__
,可以把这个理解为执行了一次父类的__init__()
函数super().__init__()
并不是在调用方法,而是按照继承顺序,执行下一个没有初始化的类。在第二个示例中,因为SubClass
继承了两个类,一个是MyClass1
,一个是MyClass2
,所以这个方法会依次执行这两个类的__init()__
super().__init()
不太好理解,见下一个示例:
class BaseClass(object):
def __init__(self):
print("构造 BaseClass")
class MyClass1(BaseClass):
def __init__(self):
super().__init__()
print("构造 MyClass1")
class MyClass2(BaseClass):
def __init__(self):
super().__init__()
print("构造 MyClass2")
class SubClass(MyClass1, MyClass2, BaseClass): # 这里,多继承了一个BaseClass
def __init__(self):
print("子类构造 MyClass1:")
super().__init__()
print("子类构造 MyClass2:")
super().__init__()
sub_class = SubClass()
输出结果与第二个一样,虽然程序在SubClass
那里多继承了一个,但是因为已经初始化了,所以就直接跳过了
在实际使用时,建议使用super().__init__()
,可以防止多次调用同一个类的初始化
参考链接
- What’s the difference between super() and Parent class name?:https://stackoverflow.com/questions/42413670/whats-the-difference-between-super-and-parent-class-name
- Python 类继承,两种初始化(init)的区别:https://blog.csdn.net/houyanhua1/article/details/78182197