- 示例:xxxClass.init(self)继承
- 示例:super().__init__()
- 两者的区别
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



