وراثت (Inheritance) و چندریختی (Polymorphism) در پایتون
در مقالات قبلی سایت پای شو، با مفاهیم پایه شیگرایی یعنی کلاس و شیء آشنا شدیم. اکنون زمان آن رسیده که پا را فراتر بگذاریم و با دو ستون اصلی و قدرتمند دیگر در برنامهنویسی شیگرا (OOP) آشنا شویم: وراثت (Inheritance) و چندریختی (Polymorphism). این دو مفهوم به برنامهنویسان کمک میکنند تا کدهایی بسیار منعطفتر، ساختاریافتهتر و با قابلیت استفاده مجدد بنویسند. در ادامه این مطلب، این مفاهیم را با زبانی ساده و مثالهای کاربردی بررسی میکنیم.
وراثت (Inheritance) چیست؟
وراثت یکی از جذابترین مفاهیم شیگرایی است که دقیقاً از دنیای واقعی الهام گرفته شده است. همانطور که در دنیای واقعی یک فرزند ویژگیهایی (مانند رنگ چشم یا قد) را از والدین خود به ارث میبرد، در پایتون نیز یک کلاس میتواند ویژگیها (Attributes) و رفتارها (Methods) را از کلاس دیگری به ارث ببرد.
-
به کلاسی که ویژگیهایش به ارث میرسد، کلاس والد (Parent Class یا Base Class) میگویند.
-
به کلاسی که این ویژگیها را دریافت میکند، کلاس فرزند (Child Class یا Derived Class) میگویند.
مزیت اصلی وراثت: جلوگیری از تکرار کد (DRY). اگر چند کلاس ویژگیهای مشترکی دارند، نیازی نیست کدهای تکراری را در همه آنها بنویسید؛ کافی است آن ویژگیها را در یک کلاس والد تعریف کرده و سایر کلاسها را ملزم کنید تا از آن ارثبری کنند.
مثال کاربردی از وراثت در پایتون
# کلاس والد
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name} در حال غذا خوردن است.")
# کلاس فرزند که از Animal ارثبری میکند
class Dog(Animal):
def bark(self):
print(f"{self.name} پارس میکند: هاپ هاپ!")
# ساخت یک شیء از کلاس فرزند
my_dog = Dog("بادی")
# استفاده از متد کلاس والد (به ارث رسیده)
my_dog.eat()
# استفاده از متد اختصاصی کلاس فرزند
my_dog.bark()
در قطعه کد بالا، کلاس Dog متد eat را از کلاس Animal به ارث برده است، بنابراین بدون اینکه نیازی به نوشتن مجدد این متد در کلاس فرزند باشد، توانستیم از آن استفاده کنیم.
چندریختی (Polymorphism) چیست؟
واژه چندریختی یا Polymorphism از دو کلمه یونانی گرفته شده و به معنای “داشتن شکلهای مختلف” است. در برنامهنویسی شیگرا، چندریختی به این معناست که ما بتوانیم از یک نام (مثلاً یک متد یا یک تابع) استفاده کنیم، اما آن متد بسته به اینکه روی چه شیئی فراخوانی میشود، رفتارهای متفاوتی از خود نشان دهد.
یکی از رایجترین روشهای پیادهسازی چندریختی در پایتون، بازنویسی متدها (Method Overriding) در بحث وراثت است. به این صورت که کلاس فرزند متدی دقیقاً همنام با متد کلاس والد تعریف میکند تا رفتار پیشفرض آن را متناسب با نیاز خود تغییر دهد یا تکمیل کند.
مثال کاربردی از چندریختی در پایتون
class Bird:
def intro(self):
print("من یک پرنده هستم.")
def flight(self):
print("بیشتر پرندهها میتوانند پرواز کنند.")
class Sparrow(Bird):
# بازنویسی متد پرواز برای گنجشک
def flight(self):
print("گنجشک به راحتی پرواز میکند.")
class Ostrich(Bird):
# بازنویسی متد پرواز برای شترمرغ
def flight(self):
print("شترمرغ نمیتواند پرواز کند.")
# ساخت اشیاء مختلف
generic_bird = Bird()
sparrow = Sparrow()
ostrich = Ostrich()
# فراخوانی متدی با نام یکسان، اما نتایج متفاوت!
generic_bird.flight()
sparrow.flight()
ostrich.flight()
در مثال بالا، متد flight در تمام کلاسها وجود دارد (یک نام یکسان)، اما زمانی که آن را برای شترمرغ (ostrich) فراخوانی میکنیم، نتیجهای کاملاً متفاوت با گنجشک (sparrow) چاپ میشود. این دقیقاً همان جادوی چندریختی است که اجازه میدهد توابع با یک رابط کاربری یکسان، منطقهای مختلفی را اجرا کنند.
جمعبندی
وراثت و چندریختی دو ابزار کلیدی برای تبدیل شدن به یک توسعهدهنده حرفهای در پایتون هستند. وراثت به شما کمک میکند کدهای مشترک را در یک جا متمرکز کرده و از کپیکاری بپرهیزید. از سوی دیگر، چندریختی انعطافپذیری بینظیری به کدهای شما میبخشد تا بتوانید با اشیاء مختلف به روشی یکپارچه و استاندارد تعامل داشته باشید.
با تسلط بر این مفاهیم و به کارگیری آنها در معماری پروژههای خود، کدهایی به مراتب تمیزتر و استانداردتر خواهید نوشت. همراه سایت پای شو باشید تا در آموزشهای بعدی به سراغ مباحث پیشرفتهتری از دنیای بیکران پایتون برویم.

بدون دیدگاه