وراثت و چندریختی در پایتون: مفاهیم متوسط

وراثت و چندریختی در پایتون: مفاهیم متوسط

در برنامه‌نویسی شیءگرا، وراثت و چندریختی دو مفهوم اساسی هستند که به ما امکان می‌دهند کدهای قابل استفاده مجدد، انعطاف‌پذیر و سازمان‌یافته‌تری بنویسیم. این دو مفهوم به ویژه در پایتون، که یک زبان شیءگرا است، اهمیت ویژه‌ای دارند. این مقاله به بررسی عمیق وراثت و چندریختی در پایتون می‌پردازد و نحوه پیاده‌سازی آن‌ها را با مثال‌های عملی نشان می‌دهد. این مقاله برای افرادی که با مفاهیم اولیه پایتون آشنا هستند و به دنبال درک عمیق‌تر مفاهیم شیءگرا هستند، مناسب است.

وراثت (Inheritance)

وراثت مکانیزمی است که به یک کلاس اجازه می‌دهد ویژگی‌ها و رفتارهای کلاس دیگری را به ارث ببرد. به عبارت دیگر، یک کلاس می‌تواند بر اساس کلاس دیگری ساخته شود و تمام خصوصیات و متدهای آن را به دست آورد. این کار باعث کاهش تکرار کد و افزایش قابلیت استفاده مجدد آن می‌شود. کلاسی که ویژگی‌ها و رفتارها را به ارث می‌دهد، به عنوان کلاس فرزند (Child Class) یا کلاس مشتق شده (Derived Class) شناخته می‌شود، و کلاسی که ویژگی‌ها و رفتارها را به ارث می‌دهد، به عنوان کلاس والد (Parent Class) یا کلاس پایه (Base Class) شناخته می‌شود.

نحوه پیاده‌سازی وراثت در پایتون

در پایتون، وراثت با استفاده از علامت دو نقطه (:) در تعریف کلاس فرزند انجام می‌شود. به عنوان مثال:

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

    def speak(self):
        print("صدای حیوان")

class Dog(Animal):
    def speak(self):
        print("واق واق")

class Cat(Animal):
    def speak(self):
        print("میو میو")

my_dog = Dog("Rex")
my_cat = Cat("Whiskers")

my_dog.speak()  # خروجی: واق واق
my_cat.speak()  # خروجی: میو میو

در این مثال، کلاس Dog و Cat از کلاس Animal به ارث می‌برند. هر دو کلاس فرزند متد speak را بازنویسی (Override) می‌کنند تا رفتار خاص خود را ارائه دهند. این نشان می‌دهد که کلاس فرزند می‌تواند متدهای کلاس والد را تغییر دهد یا رفتار جدیدی را اضافه کند.

انواع وراثت

وراثت در پایتون می‌تواند به انواع مختلفی انجام شود:

  • وراثت تکی (Single Inheritance): یک کلاس فقط از یک کلاس والد به ارث می‌برد. (مثال بالا)
  • وراثت چندگانه (Multiple Inheritance): یک کلاس از چند کلاس والد به ارث می‌برد.
  • وراثت چند سطحی (Multilevel Inheritance): یک کلاس از یک کلاس والد به ارث می‌برد، و آن کلاس والد نیز از یک کلاس والد دیگر به ارث می‌برد.
  • وراثت سلسله مراتبی (Hierarchical Inheritance): چندین کلاس از یک کلاس والد به ارث می‌برند.

وراثت چندگانه

وراثت چندگانه به یک کلاس اجازه می‌دهد تا از چندین کلاس والد به ارث ببرد. این می‌تواند بسیار قدرتمند باشد، اما همچنین می‌تواند پیچیدگی‌هایی را به همراه داشته باشد. در پایتون، وراثت چندگانه با ذکر نام کلاس‌های والد در پرانتز در تعریف کلاس فرزند انجام می‌شود.

class Swimmer:
    def swim(self):
        print("شنا کردن")

class Walker:
    def walk(self):
        print("راه رفتن")

class Duck(Swimmer, Walker):
    pass

my_duck = Duck()
my_duck.swim()  # خروجی: شنا کردن
my_duck.walk()  # خروجی: راه رفتن

در این مثال، کلاس Duck از کلاس‌های Swimmer و Walker به ارث می‌برد و می‌تواند هر دو متد swim و walk را فراخوانی کند.

چندریختی (Polymorphism)

چندریختی به معنای “چند شکلی” است و به توانایی یک شیء برای اتخاذ اشکال مختلف اشاره دارد. در برنامه‌نویسی شیءگرا، چندریختی به ما امکان می‌دهد تا با استفاده از یک رابط واحد، با اشیاء مختلف به روش‌های مختلف تعامل داشته باشیم. چندریختی به دو صورت اصلی در پایتون پیاده‌سازی می‌شود: چندریختی از طریق بازنویسی متد (Method Overriding) و چندریختی از طریق بارگذاری متد (Method Overloading).

چندریختی از طریق بازنویسی متد

همانطور که در مثال وراثت مشاهده کردیم، کلاس‌های فرزند می‌توانند متدهای کلاس والد را بازنویسی کنند. این به ما امکان می‌دهد تا رفتار یک متد را برای کلاس‌های مختلف به طور متفاوتی تعریف کنیم. این یک نوع چندریختی است.

چندریختی از طریق بارگذاری متد

بارگذاری متد به معنای داشتن چندین متد با نام یکسان در یک کلاس است که پارامترهای متفاوتی دارند. پایتون به طور مستقیم از بارگذاری متد به روشی که در برخی از زبان‌های دیگر (مانند جاوا یا C++) پشتیبانی می‌شود، پشتیبانی نمی‌کند. با این حال، می‌توان با استفاده از آرگومان‌های پیش‌فرض و آرگومان‌های متغیر (*args و **kwargs) به اثر مشابهی دست یافت.

class Calculator:
    def add(self, x, y):
        return x + y

    def add(self, x, y, z):
        return x + y + z

# این کد در پایتون خطا می‌دهد زیرا پایتون از بارگذاری متد به این شکل پشتیبانی نمی‌کند.
# برای حل این مشکل می‌توان از آرگومان‌های پیش‌فرض یا آرگومان‌های متغیر استفاده کرد.

class Calculator2:
    def add(self, x, y, z=0):
        return x + y + z

my_calculator = Calculator2()
print(my_calculator.add(1, 2))  # خروجی: 3
print(my_calculator.add(1, 2, 3))  # خروجی: 6

در این مثال، کلاس Calculator2 یک متد add دارد که می‌تواند با دو یا سه آرگومان فراخوانی شود. آرگومان z یک آرگومان پیش‌فرض است که اگر در هنگام فراخوانی متد ارائه نشود، مقدار 0 را می‌گیرد.

مزایای چندریختی

چندریختی مزایای زیادی دارد، از جمله:

  • انعطاف‌پذیری: چندریختی به ما امکان می‌دهد تا کدهای انعطاف‌پذیرتری بنویسیم که می‌توانند با انواع مختلفی از اشیاء کار کنند.
  • قابلیت استفاده مجدد: چندریختی به ما امکان می‌دهد تا کدهای قابل استفاده مجددتری بنویسیم.
  • سادگی: چندریختی می‌تواند کد را ساده‌تر و خواناتر کند.

نتیجه‌گیری

وراثت و چندریختی دو مفهوم قدرتمند در برنامه‌نویسی شیءگرا هستند که به ما امکان می‌دهند کدهای قابل استفاده مجدد، انعطاف‌پذیر و سازمان‌یافته‌تری بنویسیم. در پایتون، این دو مفهوم به طور کامل پشتیبانی می‌شوند و می‌توانند به طور موثری برای حل مسائل پیچیده استفاده شوند. درک عمیق این مفاهیم برای هر برنامه‌نویس پایتون که به دنبال نوشتن کدهای با کیفیت و قابل نگهداری است، ضروری است.

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *