Python 的 super() 和多重继承
在 Python 中,多重继承在确定调用哪个父方法时会带来复杂性。 super() 函数在此场景中起着至关重要的作用,但其行为取决于方法解析顺序 (MRO)。
MRO 和 super()
MRO 定义了在父类中搜索属性的顺序。在您的示例中:
class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it"
super(Third, self).__init__() 调用 MRO 中第一个类的 __init__() 方法。在本例中,它是 First。
选择父方法
您无法使用 super() 显式选择要调用的父方法。 MRO 规定搜索顺序,而 super() 始终引用该顺序中的第一个类。
示例(单路径继承)
在您的示例中没有交叉继承,MRO 很简单:[第三,第一,第二,对象]。因此, super(Third, self).__init__() 将始终调用 First.__init__()。
示例(交叉继承)
考虑以下代码:
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 现在是[第四,第二,第三,第一, 目的]。 super(Fourth, self).__init__() 将调用 Second.__init__(),MRO 中的第一个类。
不明确的 MRO
如果继承路径交叉(例如,First继承自Second),Python无法建立连贯的MRO,从而导致例外:
TypeError: Cannot create a consistent method resolution order (MRO) for bases Second, First
结论
super() 是处理多重继承的强大工具。然而,理解 MRO 对于预测其行为至关重要,因为它决定了使用 super().__init__().
时将调用哪个父方法以上是Python 的 super() 函数如何与多重继承和方法解析顺序 (MRO) 配合使用?的详细内容。更多信息请关注PHP中文网其他相关文章!