kha*_*hik 0 python initialization multiple-inheritance super diamond-problem
请考虑以下代码:
class A(object):
def __init__(self):
print("A.__init__")
super(A, self).__init__() # 1
print("A.__init__ finished")
class B(A):
def __init__(self):
print("B.__init__")
super(B, self).__init__() # 2
print("B.__init__ finished")
class C(A):
def __init__(self):
print("C.__init__")
super(C, self).__init__()
print("C.__init__ finished")
class D(B, C):
def __init__(self):
print("D.__init__")
print("Initializing B")
B.__init__(self) # 3
print("B initialized")
print("Initializing C")
C.__init__(self) # 4
print("C initialized")
print("D.__init__ finished")
D()
# D.__init__
# Initializing B
# B.__init__
# C.__init__
# A.__init__
# A.__init__ finished
# C.__init__ finished
# B.__init__ finished
# B initialized
# Initializing C
# C.__init__
# A.__init__
# A.__init__ finished
# C.__init__ finished
# C initialized
# D.__init__ finished
Run Code Online (Sandbox Code Playgroud)
据我了解,算法如下:
D.__init__ at (3) -> B.__init__ ->
-> super().__init__ -> (super of self.__class__).__init__ ->
-> C.__init__ (# why C?) -> super().__init__ ->
-> A.__init__
D.__init__ at (4) -> C.__init__ ->
-> super().__init__ ->
-> A.__init__
Run Code Online (Sandbox Code Playgroud)
其实有三个问题:
1.为什么super().__init__()调用B.__init__(2点)调用C.__init__时self是一个实例D?
2. 在这种情况下如何避免打电话C.__init__和A.__init__两次?
2.1初始化当前类继承的所有类的正确方法是什么?
问:当自我是D的一个实例时,为什么要super().__init__()打电话给B.__init__(2)C.__init__?
你打电话的时候
super(X, self).__init__
Run Code Online (Sandbox Code Playgroud)
Python查找MRO self.__class__.mro().然后它在X之后__init__从MRO中的下一个类调用.
当self是一个实例时D,self.__class__.mro()是[D, B, C, A].所以super(B, self).__init__()打电话C.__init__(self).
问:初始化当前类继承的所有类的正确方法是什么?
使用super in D.__init__:
class D(B, C):
def __init__(self):
print("D.__init__")
super(D, self).__init__()
print("D.__init__ finished")
Run Code Online (Sandbox Code Playgroud)