🎭
OOP Basics

Polymorphism

Duck Typing
💡 Python polymorphism "duck typing" pe based hai — "agar wo duck jaisa chalta hai aur duck jaisi awaaz karta hai, wo duck hai" — kisi cheez ka exact TYPE matter nahi karta, sirf ye matter karta hai ki uske paas zaroori methods/behavior hain ya nahi.

C++/Java mein polymorphism virtual functions/interfaces se explicit hota hai. Python mein ye implicit hai — koi bhi object jispar ek method call ho sakta hai, us context mein use ho sakta hai, chahe uska "type" declared kahi na ho. Ye Python ki dynamic nature ka natural extension hai.

Method overriding (jaise inheritance mein dekha) polymorphism ka ek form hai. Duck typing isse ek step aage le jaata hai — bina inheritance ke bhi, agar do alag classes ke paas same-named method ho, dono "polymorphically" use ho sakte hain.

class Dog:
    def speak(self):
        return "Woof!"

class Cat:
    def speak(self):
        return "Meow!"

class Duck:
    def speak(self):
        return "Quack!"

# Koi common base class nahi hai — phir bhi kaam karta hai (duck typing):
for animal in [Dog(), Cat(), Duck()]:
    print(animal.speak())   # Woof! Meow! Quack!
🎭
Python polymorphism "duck typing" pe based hai — "agar wo duck jaisa chalta hai aur duck jaisi awaaz karta hai, wo duck hai" — kisi cheez ka exact TYPE matter nahi karta, sirf ye matter karta hai ki uske paas zaroori methods/behavior hain ya nahi.
1 / 2
⚡ Quick Recap
  • Duck typing = "type nahi, behavior matter karta hai"
  • Koi common base class ke bina bhi polymorphism kaam karta hai
  • Python ki dynamic typing ka natural extension
Is page mein (1 subtopics)

Agar duck typing bahut "implicit" lagta hai, Python ka abc (Abstract Base Classes) module explicit contracts banane deta hai — C++ ke pure virtual functions / Java interfaces jaisa formal approach.

from abc import ABC, abstractmethod

class Shape(ABC):
    @abstractmethod
    def area(self):
        pass   # implementation nahi — subclass ko zaroori hai

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius
    def area(self):
        return 3.14159 * self.radius ** 2

# shape = Shape()   # ERROR: abstract class ka object nahi ban sakta
c = Circle(5)
print(c.area())   # 78.5
💡Tip: abc module usually bade codebases mein use hota hai jaha explicit contracts zaroori hain — chhote scripts mein duck typing usually kaafi hota hai, ABC overhead nahi chahiye.