注:
问题:为什么不在下面的给定代码中的A Constructor之后打印C Constructor?
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__)
注意:在打印类D的MRO时获得正确的继承顺序,但没有得到类C的构造函数调用。问题:为什么不在...]中的A构造函数之后打印C构造函数? [
3在这种情况下,搜索从D-> B-> A->对象开始,并且第一个超级对象完成。对象或类型确定要搜索的方法解析顺序。搜索从类型后面的类开始。
如果对象或类型的
mro
是D-> B-> C-> A->对象并且类型的值为B,则super()搜索C-> A->对象4然后第二个super()使您可以从继承自父类的子类中访问父类中的方法。
5在这种情况下,您可以访问C.method并在打印第一个超级类的构造函数后打印“ C方法”。super()单独返回超类的一个临时对象,然后您可以调用该超类的方法允许您以最少的代码更改换出超类。