در پایتون، Polymorphism (چندریختی) یعنی یک رابط (interface) مشترک میتواند برای انواع مختلف اشیاء رفتارهای متفاوتی داشته باشد.
به بیان ساده: یک نام – رفتارهای گوناگون.
🔹 ایدهٔ اصلی
-
چندریختی اجازه میدهد توابع یا متدهای همنام در کلاسهای مختلف کارهای متفاوت انجام دهند.
-
این باعث میشود کد انعطافپذیر و توسعهپذیر باشد.
1️⃣ چندریختی با متدهای کلاس
class Dog:
def speak(self):
return "سگ پارس میکند"
class Cat:
def speak(self):
return "گربه میو میکند"
animals = [Dog(), Cat()]
for a in animals:
print(a.speak())
📌 خروجی:
سگ پارس میکند گربه میو میکند
هر شیء متد
speak
خودش را دارد، ولی حلقه از یک نام مشترک استفاده میکند.
2️⃣ چندریختی با وراثت (Method Overriding)
کلاسهای فرزند میتوانند متد والد را بازنویسی کنند.
class Animal:
def speak(self):
return "حیوان صدا میکند"
class Dog(Animal):
def speak(self):
return "سگ پارس میکند"
class Cat(Animal):
def speak(self):
return "گربه میو میکند"
def animal_sound(animal):
print(animal.speak())
animal_sound(Dog()) # سگ پارس میکند
animal_sound(Cat()) # گربه میو میکند
3️⃣ چندریختی با توابع داخلی
توابع پایتون مثل ()len
چندریخت هستند:
print(len([1, 2, 3])) # 3 (لیست)
print(len("Hello")) # 5 (رشته)
print(len({1, 2, 3, 4})) # 4 (مجموعه)
یک تابع واحد (
len
) روی انواع مختلف عمل میکند.
4️⃣ چندریختی با عملگرها (Operator Overloading)
در پایتون میتوان رفتار عملگرها را برای کلاسهای خودمان تغییر داد.
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __repr__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Vector(4, 6)
✅ مزایای Polymorphism
-
کد ماژولار و قابل توسعه میشود.
-
نیاز به شرطهای متعدد (
if/else
) را کاهش میدهد. -
راحتی در نگهداری و تست.
💡 تمرینهای پیشنهادی
-
کلاسهای
Shape
،Circle
وRectangle
بنویس که هر کدام متدarea
خود را پیاده کنند و با یک حلقه، مساحت همه را محاسبه کن. -
عملگر
*
را برای یک کلاس ماتریس طوری پیادهسازی کن که ضرب ماتریس انجام دهد. -
تابعی بنویس که اشیاء مختلف با متد
()describe
دریافت کرده و توضیح هر کدام را چاپ کند.
✅ خلاصه
-
Polymorphism = یک نام مشترک، رفتارهای متفاوت.
-
راههای پیادهسازی:
-
متدهای همنام در کلاسهای مختلف.
-
وراثت و Override.
-
توابع و عملگرهای چندریخت (
len
,+
,*
و …).
-
-
باعث میشود کد منعطف، خوانا و قابل توسعه باشد.