در این مطلب، مفهوم وراثت چندگانه در پایتون (Multiple Inheritance In Python) و چگونگی استفاده از آن در برنامه همراه با مثال‌های متعدد تشریح شده است. همچنین، مباحث «ارث‌بری چندسطحی» (Multilevel Inheritance) و Method Resolution Order یا همان MRO مورد بررسی قرار گرفته‌اند.

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

مانند زبان «سی‌پلاس‌پلاس» (++C)، در «پایتون» (Python) هم یک کلاس می‌تواند از بیش از یک کلاس پایه مشتق شود. به این قابلیت وراثت چندگانه در پایتون گفته می‌شود. در وراثت چندگانه در پایتون ویژگی‌های همه کلاس‌های پایه در کلاس مشتق شده ارث برده شده‌اند. نحو ارث‌بری چندگانه، مشابه ارث‌بری تنها است. مثالی که در ادامه و در این راستا آمده، قابل توجه است.

class Base1:
    pass

class Base2:
    pass

class MultiDerived(Base1, Base2):
    pass

در اینجا، MultiDerived از کلاس‌های Base1 و Base2 مشتق شده‌اند.

وراثت چندگانه در پایتون -- به زبان ساده

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

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

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass

در اینجا، Derived1 از Base و Derived2 از Derived1 مشتق شده است.

وراثت چندگانه در پایتون -- به زبان ساده

Method Resolution Order در پایتون

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

# Output: True
print(issubclass(list,object))

# Output: True
print(isinstance(5.5,object))

# Output: True
print(isinstance("Hello",object))

در سناریو ارث‌بری چندگانه، هر خصیصه تعیین شده ابتدا در کلاس کنونی جستجو شده است. اگر در آن کلاس پیدا نشدند، جستجو به کلاس‌های والد در اولین عمق، و در ادامه ترتیب چپ-راست بدون آنکه یک کلاس دو بار جستجو شود، ادامه پیدا می‌کند.

بنابراین، در مثال بالا از کلاس MultiDerived، ترتیب جستجو [MultiDerived, Base1, Base2, object] است. این ترتیب، خطی‌سازی کلاس MultiDerived نیز نامیده می‌شود و مجموعه قواعدی که برای پیدا کردن آن مورد استفاده قرار می‌گیرد، «Method Resolution Order | MRO» نام دارد. MRO باید از مرتب‌سازی محلی اولویت‌ها (Local Precedence Ordering) جلوگیری و یکنوایی (Monotonicity) را فراهم کند. بدین شکل، اطمینان حاصل می‌شود که یک کلاس همیشه پیش از والدین خود ظاهر می‌شود و در صورت وجود چندین والد، ترتیب مشابه «تاپل» (Tuple) کلاس مبنا است. MRO از یک کلاس را می‌توان به عنوان خصیصه __mro__ یا روش ()mro در نظر گرفت. اولی یک تاپل را باز می‌گرداند، در حالی که خروجی دومین مورد یک لیست است.

>>> MultiDerived.__mro__
(<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>)

>>> MultiDerived.mro()
[<class '__main__.MultiDerived'>,
 <class '__main__.Base1'>,
 <class '__main__.Base2'>,
 <class 'object'>]

در اینجا، یک مثال از وراثت چندگانه در پایتون که نسبتا به موارد پیشین کمی پیچیده‌تر است همراه با روش بصری‌سازی آن با بهره‌گیری از MRO آموزش داده شده است.

وراثت چندگانه در پایتون -- به زبان ساده

class X: pass
class Y: pass
class Z: pass

class A(X,Y): pass
class B(Y,Z): pass

class M(B,A,Z): pass

# Output:
# [<class '__main__.M'>, <class '__main__.B'>,
# <class '__main__.A'>, <class '__main__.X'>,
# <class '__main__.Y'>, <class '__main__.Z'>,
# <class 'object'>]

print(M.mro())

خروجی قطعه کد بالا به صورت زیر است.

[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

بر اساس رای ۷ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.