2.1.9 · HinglishOOP Fundamentals

`super()` — calling parent methods

1,390 words6 min readRead in English

2.1.9 · Coding › OOP Fundamentals


super() KYA hai?

Toh iske bajaay:

class Dog(Animal):
    def __init__(self, name):
        Animal.__init__(self, name)   # hard-coded parent name

tum likhte ho:

class Dog(Animal):
    def __init__(self, name):
        super().__init__(name)        # decoupled from parent name

YEH kyun exist karta hai? (woh problem jo yeh solve karta hai)


YEH kaise kaam karta hai — first principles se derive kiya hua

Koi magic nahi hai. super() bas Parent.method(self) hi hai lekin parent ko dynamically MRO ke through choose kiya jaata hai.

Step 1 — har class ka ek MRO hota hai. Python ek linear order of classes compute karta hai kisi attribute ko search karne ke liye. Ise dekho:

Dog.__mro__   # (Dog, Animal, object)

Step 2 — class C ke method ke andar super() ka matlab hai:

"type(self) ke MRO mein C ke baad wali position se search shuru karo, aur self bind karo."

Step 3 — equivalence derive karo. Dog.__init__ ke andar, super() conceptually yeh hai: jo type(self).__mro__ mein Dog ke baad wali class (yahan Animal) dhoondta hai aur uska method self ke saath call karta hai jo pehle se supplied hai. Isliye tum super().__init__(name) likhte ho aur nahi super().__init__(self, name)self automatically inject ho jaata hai.

Figure — `super()` — calling parent methods

Worked Example 1 — __init__ extend karna

class Animal:
    def __init__(self, name):
        self.name = name
        self.legs = 4
 
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)   # parent sets name + legs
        self.breed = breed       # child adds extra state
 
d = Dog("Rex", "Lab")
print(d.name, d.legs, d.breed)   # Rex 4 Lab
  • super().__init__(name) pehle kyun? Taaki self.name aur self.legs child ke apne attributes add karne se pehle exist karein — child extend karta hai, replace nahi karta.
  • self kyun nahi? Proxy ne already self bind kar liya hai; dobara pass karne par "got multiple values for argument" error aata hai.

Worked Example 2 — ek normal method extend karna

class Logger:
    def save(self, data):
        print("validating", data)
        return True
 
class TimestampLogger(Logger):
    def save(self, data):
        ok = super().save(data)      # reuse parent's validation
        print("saved at 12:00", data)
        return ok
  • Validation copy karne ki jagah super().save kyun call karte hain? Agar Logger mein validation logic change ho, to child automatically sahi rehta hai (single source of truth).

Worked Example 3 — multiple inheritance aur MRO

class A:
    def __init__(self): print("A"); super().__init__()
class B(A):
    def __init__(self): print("B"); super().__init__()
class C(A):
    def __init__(self): print("C"); super().__init__()
class D(B, C):
    def __init__(self): print("D"); super().__init__()
 
D()                 # prints D B C A  (each ONCE)
print([c.__name__ for c in D.__mro__])  # D B C A object
  • D B C A kyun aur D B A C A kyun nahi? Kyunki B mein super() ka matlab "go to A" nahi hai — iska matlab hai "D ke MRO mein next class pe jao," jo C hai. MRO guarantee karta hai ki A exactly ek baar run ho. Yeh woh killer feature hai jo tum A.__init__(self) se nahi paa sakte.


Recall Feynman: ek 12-saal ke bachche ko explain karo

Socho tumhare papa ke paas soup ki recipe hai. Tum wohi soup banana chahte ho lekin upar se cheese daalna chahte ho. Poori recipe dobara likhne ki jagah tum kehte ho "Papa, apna soup banao" (super()), aur phir tum cheese chirakate ho. Agar Papa apna soup improve karein, tumhara bhi automatically better ho jaata hai — free mein. super() bas "family line mein mujhse upar wale ko" bulaana hai taaki woh apna hissa pehle kar sakein.



Flashcards

super() kya return karta hai?
Ek proxy object jo method calls ko current object ke MRO mein next class ko delegate karta hai (current class ke baad).
super().__init__(name) kyun likhte hain aur super().__init__(self, name) kyun nahi?
Proxy pehle se self bind kar chuka hai; dobara pass karne par "multiple values for argument self" error aata hai.
Multiple inheritance mein, kya super() ka matlab "parent class" hai?
Nahi — iska matlab hai type(self).__mro__ mein next class, jo ek sibling bhi ho sakta hai.
Agar tum __init__ override karo aur kabhi super().__init__() call na karo, toh kya hoga?
Parent attributes initialize nahi honge → baad mein likely AttributeError aayega.
class D(B,C) ke liye jahan B(A), C(A) ho, D ka MRO kya hai?
D, B, C, A, object.
Diamond mein super() use karne se base class sirf ek baar kyun run hoti hai?
Kyunki har super() ek hi linearized MRO mein aage badhta hai, isliye har class exactly ek baar visit hoti hai.
super() ka Parent.__init__(self) par ek concrete advantage?
Decoupling — hierarchy rename/reorder karne par call nahi tootnta.

Connections

Concept Map

still needs

delegates to

walks

starts after

enables

gives

ensures

visited once each

binds

so omit self in

derived from

finds next in

Child overrides method

super() proxy object

MRO - Method Resolution Order

Parent implementation

Extend not replace behaviour

No hard-coded parent name

Diamond inheritance correctness

self injected automatically

super() == super(Dog, self)