调用构造函数时python中多重和多级继承中的方法顺序解析
注意事项:调用构造函数时python中多重和多级继承中的方法顺序解析,python,class,oop,constructor,multiple-inheritance,Python,Class,Oop,Constructor,Multiple Inheritance,注意事项: 在打印类D的MRO时获得正确的继承顺序,但没有获得类C的构造函数调用 问题:为什么不在下面给定代码中的构造函数之后打印C构造函数 class A(object): def __init__(self): print("A Constructor") class B(A): def __init__(self): print("B Constructor") super(B, self).__init__() cla
class A(object):
def __init__(self):
print("A Constructor")
class B(A):
def __init__(self):
print("B Constructor")
super(B, self).__init__()
class C():
def __init__(self):
print("C Constructor")
super().__init__()
def method(self):
print("C method")
class D(B, C):
def __init__(self):
print("D Constructor")
super(D, self).__init__()
super().method()
d = D()
print(D.__mro__)
输出:
1 C的init从未被称为cos 2 super在D上开始搜索,在D->B->A->上搜索,在->对象上搜索结束 3在这种情况下,搜索开始D->B->A->object,并完成第一个super 对象或类型确定要搜索的方法解析顺序。搜索从类型后面的类开始 如果对象或类型的mro为D->B->C->A->object且类型的值为B,则super()搜索C->A->object 4然后,second super()允许您从继承的子类访问超类中的方法 5在本例中,您可以访问C.method,并在打印第一个super的构造函数后打印oue“C method” super()单独返回超类的临时对象,然后允许您调用该超类的方法
允许您以最少的代码更改交换超类。如果您想了解MRO在Python中的工作方式,我建议您看看这个 在Python2.3及更高版本中,Python对MRO使用C3线性化算法
祝你好运。我无法解释,所以我不发布答案,但解决方法是将:
D类(B,C):
更改为D类(C,B):
@U9 Forward:是的,在从D类(B,C)更改为D类(C,B)时能够打印所有必需的值。但是我想知道为什么上面的代码没有给出预期的答案。是的,这就是为什么我没有回答可能重复的@blhsing在打印D时得到正确的顺序。但是没有得到C类的构造函数调用