Home > Backend Development > Python Tutorial > How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?

How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?

Barbara Streisand
Release: 2024-12-30 08:26:08
Original
453 people have browsed it

How Does Python's `super()` Function Work with Multiple Inheritance and Method Resolution Order (MRO)?

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"
Copy after login

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"
Copy after login

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
Copy after login

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!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template