Multiple inheritance — Python's C3 linearization algorithm
2.1.10· Coding › OOP Fundamentals
WHY humein C3 chahiye?
A
/ \
B C
\ /
D
WHAT kya galat hota hai bina achhe algorithm ke:
- Purana Python (pre-2.3) depth-first, left-to-right use karta tha:
D → B → A → C. Disaster — usneAkoCse pehle check kiya, jabkiCAse "zyada derived" hai. - Hum chahte hain: ek child hamesha apne parents se pehle aaye, aur original parent order preserve ho.
C3 dono fix karta hai. Teen properties jo yeh guarantee karta hai:
- Consistency with local precedence —
classstatement mein parents ka order maintain rehta hai. - Monotonicity — agar kisi parent ke MRO mein
X,Yse pehle aata hai, to woh order kisi bhi subclass mein kabhi reverse nahi hoga. - Child hamesha apne saare parents se pehle appear karta hai.
HOW algorithm kaam karta hai — scratch se derive kiya hua
HOW merge kaam karta hai (yahi dil hai):
Worked Example 1 — Diamond
Classes: class A, class B(A), class C(A), class D(B, C).
Step — pehle simple waalon ko linearize karo. Yeh step kyun? C3 recursive hai; se pehle humein aur chahiye.
Step — D ko linearize karo. Yeh step kyun? Ab dono parents ke saath master formula apply karo.
Ab merge chalao:
| Iter | Lists | Candidate head | Good? | Why |
|---|---|---|---|---|
| 1 | [B,A,O] [C,A,O] [B,C] |
B |
✅ | B kisi tail mein nahi hai |
| 2 | [A,O] [C,A,O] [C] |
A |
❌ | A list 2 ki tail mein hai → skip; C try karo (list2 ka head) ✅ |
| 3 | [A,O] [A,O] [] |
A |
✅ | ab kisi tail mein nahi hai |
| 4 | [O] [O] [] |
O |
✅ |
Result: .

Worked Example 2 — ek inconsistent hierarchy
class X, class Y, class A(X, Y), class B(Y, X), class C(A, B).
Yeh kyun dekhein? Yeh dikhata hai jab C3 fail karta hai aur Python class ko reject karta hai.
, .
Aemit karo ✅ → lists:[X,Y,O] [B,Y,X,O] [B]Xtry karo: woh list 2 ke tail mein hai (...,Y,X,O) → skip.Btry karo (list 2 ka head): kyaBkisi tail mein hai? Nahi →Bemit karo ✅ →[X,Y,O] [Y,X,O] []Xtry karo: list 2 ke tail mein hai (Y,X,O) → skip.Ytry karo (list2 ka head): list 1 ke tail mein hai (X,Y,O) → skip. Koi good head nahi!
→ TypeError: Cannot create a consistent method resolution order (MRO). Reason: A chahta hai X before Y, B chahta hai Y before X. Contradiction → koi valid linear order exist nahi karta.
Common mistakes
Flashcards
MRO ka matlab kya hai aur woh hai kya?
C3 linearization of class C ko kaun sa formula define karta hai?
C3 merge mein head "good head" kab hota hai?
Jo head kisi list ke tail mein milta hai uske saath kya hota hai?
D(B,C) ka MRO kya hai jahan B(A), C(A) hain?
[D, B, C, A, object].Kyun shared base MRO mein sirf ek baar aur apne descendants ke baad appear karta hai?
Python kya error raise karta hai jab C3 consistent MRO nahi bana pata?
TypeError: Cannot create a consistent method resolution order (MRO).Kya super() literal parent class ko call karta hai?
C3 ka base case kya hai?
C3 ki teen guarantees ke naam batao.
Recall Feynman: 12-saal-ke-bachche ko samjhao
Socho tum apne family se koi sawaal poochh rahe ho, aur ek rule hai pehle kisse poochho. Tum khud se poochho, phir mom se, phir dad se (jis order mein listed hain), aur sirf unke dono ke baad grandma se poochho — kyunki grandma sabki parent hai, isliye usse tab tak wait karna hoga jab tak uske saare bachche se poochha na jaaye. C3 bas woh careful rule hai jo yeh "pehle kisse poochho" ki line banata hai taaki kisi ke bhi parent se unse pehle kabhi na poochha jaaye, aur grandma line mein sirf ek baar khadi ho.
Connections
- Method Resolution Order
- super() and cooperative inheritance
- The Diamond Problem
- Single inheritance
- Mixins
- Composition vs Inheritance
- Topological sort (C3 ek constrained topological ordering hai)