Multiple inheritance — the deep end
Python lets a class inherit from more than one parent. class C(A, B): is legal. The question that immediately arises: if both A and B define method(), which one wins on C().method()? The answer is the method resolution order (MRO) — a deterministic linearization of the inheritance graph computed by the C3 algorithm.
The C3 algorithm — the rule, not the proof
You don't need to memorize the algorithm. The rule it produces, in plain English: a class comes before all its parents, and parents appear in the order you wrote them. Python combines these constraints across the whole tree to get a single ordering. Cls.__mro__ shows it. If the constraints can't be satisfied, you get a TypeError at class definition time.
super() in multiple inheritance — the cooperative call
In single inheritance, super().method() calls the parent's method. In multiple inheritance, it calls the next class in the MRO, not necessarily the parent. This is "cooperative multiple inheritance" — every class in a diamond can call super() and the calls walk the MRO in order, hitting each class once.
super(), every class in the chain must accept and forward **kwargs. If one class forgets, the chain breaks. This is the cost of cooperative multiple inheritance and a major reason why most Python code prefers composition.
The diamond — and why MRO is non-trivial
The classic case: D inherits from B and C, both of which inherit from A. Without MRO, calling D().method() would risk calling A.method twice. C3 ensures every ancestor appears exactly once in the MRO, in an order consistent with all the local parent orderings.