Python 多重继承中的 Super()
Python 中的多重继承带来了 super() 如何与其交互的问题。考虑下面的代码:
class First(object): def __init__(self): print("first") class Second(object): def __init__(self): print("second") class Third(First, Second): def __init__(self): super(Third, self).__init__() print("that's it")
现在, super().__init__ 引用了 Third 的哪个父方法?你能选择运行哪一个吗?
为了在这种情况下理解 super(),我们深入研究方法解析顺序 (MRO) 的概念。在 Python 中,MRO 定义了涉及多重继承时解析方法的顺序。
在我们的示例中,Third() 将调用 First.__init__。 Python 从左到右检查类父类中的每个属性。对于 __init__,Python 首先在 First 中查找,如果在那里没有找到,则在 Second 中检查。
随着继承的交织,情况变得更加复杂。请阅读 Guido 关于 MRO 的博客文章了解更多相关信息。然而,Python 通常会保持所写的继承顺序,从子类本身开始。
考虑以下示例:
class First(object): def __init__(self): print("first") class Second(First): def __init__(self): print("second") class Third(First): def __init__(self): print("third") class Fourth(Second, Third): def __init__(self): super(Fourth, self).__init__() print("that's it")
这里,MRO 将是 [第四,第二,第三,第一]。
需要注意的是,如果Python无法确定一致的MRO,它会引发异常,而不是诉诸潜在的意外
此外,值得一提的是,提供的示例不使用 super() 调用。它们的目的是演示 MRO 的构建方式,而不是打印特定的输出。我们鼓励您尝试 super() 调用,以更深入地了解 Python 的继承模型。
以上是Python多重继承中`super()`如何解决方法调用?的详细内容。更多信息请关注PHP中文网其他相关文章!