注释:
问题:为什么不在下面的给定代码中的 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__)
答案 0 :(得分:0)
1 C的 init 从未被称为cos
2超级开始在D上搜索D-> B-> A->,然后在->对象上结束
3在这种情况下,搜索从D-> B-> A->对象开始,并且第一个超级对象完成。
对象或类型确定要搜索的方法解析顺序。搜索从类型后面的类开始。
如果object-or-type的 mro 为D-> B-> C-> A->对象,并且type的值为B,则super()搜索C-> A- >对象
4然后第二个super()允许您从继承自父类的子类中访问父类中的方法。
5在这种情况下,您可以访问C.方法并在打印第一个超级类的构造函数之后打印“ C方法”。
super()单独返回超类的临时对象,然后您可以调用该超类的方法 允许您以最少的代码更改换出超类。
答案 1 :(得分:0)