آموزش پایتون - وراثت چندسطحی

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

وراثت چندسطحی در پایتون

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

کلاسی که در بالاترین سطح این زنجیره قرار دارد، کلاس پایه یا کلاس والد نامیده می‌شود. کلاس میانی، کلاس مشتق‌شده یا کلاس فرزند نام دارد و کلاسی که در پایین‌ترین سطح زنجیره قرار می‌گیرد، کلاس زیرمشتق‌شده یا کلاس زیرفرزند نامیده می‌شود.

تصاویر زیر مفهوم وراثت چندسطحی را نشان می‌دهند:

Multilevel Inheritance in Python

مثالی از وراثت چندسطحی در پایتون

برای درک نحوه عملکرد وراثت چندسطحی در پایتون، به مثال زیر توجه کنید:

# Base class
class Network:
    def connectivity(self):
        return "Network connects"

# Derived class
class Network_5G(Network):
    def fast_connectivity(self):
        return "5G Network provides superfast connectivity"

# Sub-derived class
class Network_5G_Airtel(Network_5G):
    def fast_and_stable_connectivity(self):
        return "Airtel 5G network is fast and remains stable"    

# Creating an instance of Network_5G_Airtel
network_object = Network_5G_Airtel()
print(network_object.connectivity())        # Inherited from Network class
print(network_object.fast_connectivity())   # Inherited from Network_5G class
print(network_object.fast_and_stable_connectivity())   # Inherited from Network_5G_Airtel class

در این کد، کلاس Network_5G_Airtel توابع و ویژگی‌های کلاس Network_5G را به ارث می‌برد و کلاس Network_5G نیز از کلاس Network ارث‌بری می‌کند. بنابراین، کلاس Network_5G_Airtel به متدهایی مانند connectivity() (از کلاس Network)، fast_connectivity() (از کلاس Network_5G) و fast_and_stable_connectivity() (که متعلق به خود کلاس Network_5G_Airtel است) دسترسی خواهد داشت.

هنگامی که کد را اجرا کنید، خروجی آن به شکل زیر خواهد بود:

Network connects
5G Network provides superfast connectivity
Airtel 5G network is fast and remains stable

ترتیب حل متدها (MRO) در وراثت چندسطحی پایتون

سناریویی را در نظر بگیرید که در آن، مانند مثال بالا، کلاس Network_5G نیز متدی به نام connectivity() داشته باشد. حال اگر متد connectivity() را از نمونه‌ای از کلاس Network_5G_Airtel فراخوانی کنیم، چه اتفاقی می‌افتد؟ در اینجا مفهوم ترتیب حل متدها (Method Resolution Order یا MRO) مطرح می‌شود.

بیایید مثال قبلی را تغییر دهیم و متد connectivity() را نیز به کلاس Network_5G اضافه کنیم:

# Base class
class Network:
    def connectivity(self):
        return "Network connects"

# Derived class
class Network_5G(Network):
    def fast_connectivity(self):
        return "5G Network provides superfast connectivity"

    def connectivity(self):
        return "5G Network connects faster"

# Sub-derived class
class Network_5G_Airtel(Network_5G):
    def fast_and_stable_connectivity(self):
        return "Airtel 5G network is fast and remains stable"

# Creating an instance of Network_5G_Airtel
obj1 = Network_5G_Airtel()
print(obj1.connectivity())  # Inherited from Network class

خروجی کد بالا به شکل زیر خواهد بود:

5G Network connects faster

این نتیجه نشان می‌دهد که متد connectivity() از کلاس Network_5G فراخوانی می‌شود، نه متد هم‌نام آن در کلاس Network. دلیل این اتفاق آن است که ترتیب حل متدها (MRO) در پایتون از یک رویکرد عمق‌اول پیروی می‌کند؛ به این معنی که ابتدا متد موردنظر را در کلاس فعلی جست‌وجو می‌کند، سپس به سراغ کلاس والد می‌رود و این روند را در سلسله‌مراتب کلاس‌ها ادامه می‌دهد.

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

print(Network_5G_Airtel.mro())

Output:
[<class '__main__.Network_5G_Airtel'>, <class '__main__.Network_5G'>, 
<class '__main__.Network'>, <class 'object'>]

بازنویسی متدها در وراثت چندسطحی

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

مثال زیر نحوه بازنویسی متدها در وراثت چندسطحی را نشان می‌دهد:

# Base class
class Vehicle:
    def start(self):
        return "Vehicle starts"

# Derived class
class Car(Vehicle):
    def start(self):
        return "Car starts"

# Sub-derived class
class SportsCar(Car):
    def start(self):
        return "Sports Car starts"

# Creating an instance of SportsCar
sports_car = SportsCar()
print(sports_car.start())  # Calls the start method of SportsCar class

خروجی کد بالا به شکل زیر خواهد بود:

Sports Car starts

نتیجه‌گیری

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

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.