super
mro 初始化顺序
- 广度优先
- 从左到右
class A(object):
def __init__(self, value):
self.value = value
def t(self):
print('a')
class B(A):
def __init__(self, value):
A.__init__(self, value)
self.value *= 5
class C(A):
def __init__(self, value):
A.__init__(self, value)
self.value += 2
def t(self):
print('c')
class D(B, C):
def __init__(self, value):
B.__init__(self, value)
C.__init__(self, value)
d = D(5)
d.t()
print(d.value)
# c
# 7
- 为了统一初始化多个或一个父类
- 避免公共基类的
__init__
方法被多次调用
class A(object):
def __init__(self, value):
self.value = value
class B(A):
def __init__(self, value):
super().__init__(value)
self.value *= 5
class C(A):
def __init__(self, value):
super().__init__(value)
self.value += 2
class D(B, C):
def __init__(self, value):
super().__init__(value)
d = D(5)
print(d.value)
# 35
from pprint import pprint
pprint(D.mro())
# [<class '__main__.D'>,
# <class '__main__.B'>,
# <class '__main__.C'>,
# <class '__main__.A'>,
# <class 'object'>]
d = D(5) 时
1. 调用D.__init__方法
2. 调用B.__init__方法
3. 调用C.__init__方法
4. 调用A.__init__方法
那些__init__然后以相反的顺序来初始化