Python's super() and Multiple Inheritance
In Python, multiple inheritance introduces complexities when determining which parent method to invoke. The super() function plays a crucial role in this scenario, but its behavior depends on the method resolution order (MRO).
MRO and super()
The MRO defines the sequence in which parent classes are searched for attributes. In your example:
class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it"
super(Third, self).__init__() calls the __init__() method of the first class in the MRO. In this case, it's First.
Choice of Parent Method
You cannot explicitly choose which parent method to call using super(). The MRO dictates the order of search, and super() always refers to the first class in that order.
Example (Single Path Inheritance)
In your example with no crossed inheritance, the MRO is straightforward: [Third, First, Second, object]. Therefore, super(Third, self).__init__() will always call First.__init__().
Example (Crossed Inheritance)
Consider the following code:
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"
The MRO is now [Fourth, Second, Third, First, object]. super(Fourth, self).__init__() will call Second.__init__(), the first class in the MRO.
Ambiguous MRO
If the inheritance paths交叉 (e.g., First inherited from Second), Python cannot establish a coherent MRO, resulting in an exception:
TypeError: Cannot create a consistent method resolution order (MRO) for bases Second, First
Conclusion
super() is a powerful tool for working with multiple inheritance. However, understanding the MRO is crucial to predicting its behavior, as it dictates which parent method will be invoked when using super().__init__().
The above is the detailed content of How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?. For more information, please follow other related articles on the PHP Chinese website!