Why is an __init__ skipped when doing Base.__init__(self) in multiple inheritance instead of super().__init__()?
究竟为什么
1 2 3 | A.__init__() B.__init__() D.__init__() |
按以下代码打印?特别地:
为什么不打印
如果我把
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #!/usr/bin/env python3 class A(object): def __init__(self): super(A, self).__init__() print("A.__init__()") class B(A): def __init__(self): A.__init__(self) print("B.__init__()") class C(A): def __init__(self): A.__init__(self) print("C.__init__()") class D(B, C): def __init__(self): super(D, self).__init__() print("D.__init__()") D() |
tl;dr:因为
为什么不打印c.u init_uu()?
因为你没有告诉我。多重继承涉及合作,并且您已经使用了显式的类引用,拒绝了合作。
如果您用
1 2 3 4 | A.__init__() C.__init__() B.__init__() D.__init__() |
事实上,如果您只更改
1 2 | super(B, self).__init__() super().__init__() |
那么为什么在你的案件中A没有打电话给C?
复制网站上其他地方关于MRO的详细答案是多余的。
- python的super()如何处理多重继承?
- python的"super"如何做正确的事情?
如果我把super()而不是"init"(self),为什么要打印c.u init_uu()?
因为no-argument super()从左向右,所以首先查看
*正如你所注意到的,
1 | (<class '__main__.B'>, <class '__main__.C'>) |
在
1 | (<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>) |
和
简而言之,python知道