A call to super(D, self) returns a super-Object.
It finds the next class following D in self.__class__mro__
>>> D.__mro__
(<class 'ABCD_super.D'>, <class 'ABCD_super.B'>, <class 'ABCD_super.C'>, <class 'ABCD_super.A'>, <type 'object'>)
class A(object):
def m(self):
print("do A")
class B(A):
def m(self):
print("do B")
super(B, self).m()
class C(A):
def m(self):
print("do C")
super(C, self).m()
class D(B,C):
def m(self):
print("do D")
super(D, self).m()
Class B
Class A
Class C