为什么在多次继承中执行Base .__ init __(self)而不是super().__ init __()时会跳过__init__?

用户541686:

为什么恰好

A.__init__()
B.__init__()
D.__init__()

通过以下代码打印?特别是:

  1. 为什么C.__init__() 打印?

  2. 为什么要C.__init__()打印super().__init__()而不是打印A.__init__(self)

#!/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;博士:因为B.__init__是什么应该打电话给C.__init__通过super(B, self).__init__(),你绕过这一呼吁。


为什么不打印C .__ init __()?

因为你没有告诉。多重继承涉及合作,您已经使用了显式的类引用,但拒绝了这种合作。

如果您将所有“超级类似”调用替换为super().__init__()(因为您已将其标记为Python 3),您将看到类似以下的输出:

A.__init__()
C.__init__()
B.__init__()
D.__init__()

实际上,如果将B“超级类”调用更改为以下任何一个,您将看到此输出

super(B, self).__init__()
super().__init__()

那么,为什么在您的情况下A不给C打电话呢?

复制网站上有关MRO的概述良好的答案将是多余的。

如果我放上super().__ init __()而不是A .__ init __(self),为什么会打印C .__ init __()?

因为无参数的super()从左到右,所以B先看一下,然后在B内使用显式类引用(A.__init__(self))。这样一来,您将失去D 也是超类的所有(大多数*)上下文C

super()是什么可以帮助您导航MRO,并且C.__init__()让您放心使用它。但在B中,您只是调用的类方法A

*正如您所提到的C.__init__(),永远不会调用。但是,C仍然显示在D.__bases__

(<class '__main__.B'>, <class '__main__.C'>)

D.__mro__

(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.A'>, <class 'object'>)

isinstance(D(), C) is True

简而言之,Python 知道C是的超类D,但是您为实现提供了C.__init__和最终运行B.__init__

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多重继承Python,super().__ init__问题

来自分类Dev

在super.init中引用self

来自分类Dev

继承和__init__

来自分类Dev

Python 3 中的 __init__ 和 self

来自分类Dev

__init__中的UnboundLocalError

来自分类Dev

只要init调用[super init],在Objective C自定义init方法中调用[self init]是否可以?

来自分类Dev

super().__ init__覆盖属性

来自分类Dev

为什么self = [super init]确保单例模式?

来自分类Dev

元组的子类中的“ tuple .__ init__”与“ super().__ init__`”有何不同?

来自分类Dev

如果仅调用super .__ init__是必需的__init__吗?

来自分类Python

为什么super().__ init__没有自我引用?

来自分类Python

使用__init__继承属性

来自分类Dev

__init__可以在调用super之后自动执行代码吗?

来自分类Dev

为什么在具有多重继承的 super() 时不能调用所有 __init__ ?

来自分类Dev

someclass .__ init__做什么

来自分类Dev

为什么__init__在python中失败

来自分类Dev

__init __(self)-> None:vs __init __(self):在python中

来自分类Dev

在 __init__ 中设置属性

来自分类Python

处理__init__中的异常

来自分类Dev

在 Flask 中从 __init__ 导入

来自分类Dev

Python:类中的 __init__

来自分类Dev

__init__函数似乎是在定义而不是实例上执行

来自分类Dev

Python,在__init__中获取self.request.get()的值

来自分类Dev

如何在 julia 中实现 self 和 __init__()

来自分类Dev

为什么std :: ios_base :: Init中的“ Init”是大写的?

来自分类Dev

为什么 super().__init__ () 的行为与 Python 派生类中的 super().override() 不同?

来自分类Dev

为什么Swift不允许在类init中而不是在协议init中分配给self?

来自分类Dev

为什么Visual Studio Code会在派生类中插入“ return super().__ init __(self)”?

来自分类Dev

在Objective-C中,为什么要检查self = [super init]是否不为零?

Related 相关文章

  1. 1

    多重继承Python,super().__ init__问题

  2. 2

    在super.init中引用self

  3. 3

    继承和__init__

  4. 4

    Python 3 中的 __init__ 和 self

  5. 5

    __init__中的UnboundLocalError

  6. 6

    只要init调用[super init],在Objective C自定义init方法中调用[self init]是否可以?

  7. 7

    super().__ init__覆盖属性

  8. 8

    为什么self = [super init]确保单例模式?

  9. 9

    元组的子类中的“ tuple .__ init__”与“ super().__ init__`”有何不同?

  10. 10

    如果仅调用super .__ init__是必需的__init__吗?

  11. 11

    为什么super().__ init__没有自我引用?

  12. 12

    使用__init__继承属性

  13. 13

    __init__可以在调用super之后自动执行代码吗?

  14. 14

    为什么在具有多重继承的 super() 时不能调用所有 __init__ ?

  15. 15

    someclass .__ init__做什么

  16. 16

    为什么__init__在python中失败

  17. 17

    __init __(self)-> None:vs __init __(self):在python中

  18. 18

    在 __init__ 中设置属性

  19. 19

    处理__init__中的异常

  20. 20

    在 Flask 中从 __init__ 导入

  21. 21

    Python:类中的 __init__

  22. 22

    __init__函数似乎是在定义而不是实例上执行

  23. 23

    Python,在__init__中获取self.request.get()的值

  24. 24

    如何在 julia 中实现 self 和 __init__()

  25. 25

    为什么std :: ios_base :: Init中的“ Init”是大写的?

  26. 26

    为什么 super().__init__ () 的行为与 Python 派生类中的 super().override() 不同?

  27. 27

    为什么Swift不允许在类init中而不是在协议init中分配给self?

  28. 28

    为什么Visual Studio Code会在派生类中插入“ return super().__ init __(self)”?

  29. 29

    在Objective-C中,为什么要检查self = [super init]是否不为零?

热门标签

归档