How does Python's super() work with multiple inheritance?

后端 未结 16 2198
孤街浪徒
孤街浪徒 2020-11-21 05:19

I\'m pretty much new in Python object oriented programming and I have trouble understanding the super() function (new style classes) especially when it comes to

16条回答
  •  暖寄归人
    2020-11-21 05:48

    I would like to add to what @Visionscaper says at the top:

    Third --> First --> object --> Second --> object
    

    In this case the interpreter doesnt filter out the object class because its duplicated, rather its because Second appears in a head position and doesnt appear in the tail position in a hierarchy subset. While object only appears in tail positions and is not considered a strong position in C3 algorithm to determine priority.

    The linearisation(mro) of a class C, L(C), is the

    • the Class C
    • plus the merge of
      • linearisation of its parents P1, P2, .. = L(P1, P2, ...) and
      • the list of its parents P1, P2, ..

    Linearised Merge is done by selecting the common classes that appears as the head of lists and not the tail since order matters(will become clear below)

    The linearisation of Third can be computed as follows:

        L(O)  := [O]  // the linearization(mro) of O(object), because O has no parents
    
        L(First)  :=  [First] + merge(L(O), [O])
                   =  [First] + merge([O], [O])
                   =  [First, O]
    
        // Similarly, 
        L(Second)  := [Second, O]
    
        L(Third)   := [Third] + merge(L(First), L(Second), [First, Second])
                    = [Third] + merge([First, O], [Second, O], [First, Second])
    // class First is a good candidate for the first merge step, because it only appears as the head of the first and last lists
    // class O is not a good candidate for the next merge step, because it also appears in the tails of list 1 and 2, 
                    = [Third, First] + merge([O], [Second, O], [Second])
    // class Second is a good candidate for the second merge step, because it appears as the head of the list 2 and 3
                    = [Third, First, Second] + merge([O], [O])            
                    = [Third, First, Second, O]
    

    Thus for a super() implementation in the following code:

    class First(object):
      def __init__(self):
        super(First, self).__init__()
        print "first"
    
    class Second(object):
      def __init__(self):
        super(Second, self).__init__()
        print "second"
    
    class Third(First, Second):
      def __init__(self):
        super(Third, self).__init__()
        print "that's it"
    

    it becomes obvious how this method will be resolved

    Third.__init__() ---> First.__init__() ---> Second.__init__() ---> 
    Object.__init__() ---> returns ---> Second.__init__() -
    prints "second" - returns ---> First.__init__() -
    prints "first" - returns ---> Third.__init__() - prints "that's it"
    

提交回复
热议问题