وراثت و چندشکلی

اصلاح شده

2026-07-25

وراثت (Inheritance) چیست؟

  • یک کلاس (فرزند/Child) می‌تونه ویژگی‌ها و متدهای کلاس دیگه (والد/Parent) رو به ارث ببره
  • هدف: جلوگیری از تکرار کد، سازمان‌دهی سلسله‌مراتبی

تعریف وراثت

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(f"{self.name} makes a sound.")

class Dog(Animal):    # Dog از Animal ارث می‌بره
    pass

d = Dog("Rex")
d.speak()
Rex makes a sound.
  • Dog(Animal) یعنی Dog فرزند Animal هست

Override کردن متد (بازنویسی)

  • کلاس فرزند می‌تونه متد کلاس والد رو با رفتار متفاوت بازنویسی کنه
class Dog(Animal):
    def speak(self):
        print(f"{self.name} says: Woof!")

d = Dog("Rex")
d.speak()
Rex says: Woof!

استفاده از super()

  • برای فراخوانی متد کلاس والد از داخل کلاس فرزند (بدون بازنویسی کامل)
class Dog(Animal):
    def __init__(self, name, breed):
        super().__init__(name)     # فراخوانی __init__ کلاس والد
        self.breed = breed

    def speak(self):
        super().speak()            # اجرای رفتار والد هم
        print(f"{self.name} says: Woof!")

d = Dog("Rex", "Labrador")
d.speak()
Rex makes a sound.
Rex says: Woof!

چندشکلی (Polymorphism) چیست؟

  • یعنی اشیاء از کلاس‌های مختلف، با همون نام متد، رفتار متفاوتی نشون بدن
  • کد می‌تونه با اشیاء مختلف به یک شکل کار کنه، بدون اینکه نوع دقیقشون رو بدونه
class Cat(Animal):
    def speak(self):
        print(f"{self.name} says: Meow!")

animals = [Dog("Rex", "Labrador"), Cat("Whiskers")]

for a in animals:
    a.speak()
Rex says: Woof!
Whiskers says: Meow!
  • همه‌ی متد speak() رو یکسان صدا زدیم، ولی هرکدوم رفتار خودشون رو دارن

بررسی رابطه کلاس‌ها

تابع کار
isinstance(obj, Class) آیا شیء نمونه‌ای از این کلاس (یا فرزندانش) هست
issubclass(Child, Parent) آیا این کلاس فرزند اون کلاسه
print(isinstance(d, Animal))    # True
print(issubclass(Dog, Animal))  # True

وراثت چندگانه (Multiple Inheritance) — اشاره کوتاه

  • پایتون اجازه می‌ده یک کلاس از چند کلاس ارث ببره
class A:
    pass
class B:
    pass
class C(A, B):
    pass

نکته کلاسی: وراثت چندگانه قدرتمنده ولی می‌تونه پیچیدگی ایجاد کنه (ترتیب جستجوی متدها — MRO)؛ فعلاً فقط آشنایی کافیه.