وراثت و چندشکلی
وراثت (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)؛ فعلاً فقط آشنایی کافیه.