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

۷۵۲ بازدید
آخرین به‌روزرسانی: ۲۰ اردیبهشت ۱۴۰۲
زمان مطالعه: ۲ دقیقه
وراثت چندگانه در پایتون — به زبان ساده

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

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

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

مثالی که در ادامه و در این راستا آمده، قابل توجه است.

1class Base1:
2    pass
3
4class Base2:
5    pass
6
7class MultiDerived(Base1, Base2):
8    pass

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

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

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

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

مثالی همراه با بصری‌سازی متناظر در زیر ارائه شده است.

class Base:
    pass

class Derived1(Base):
    pass

class Derived2(Derived1):
    pass

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

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

Method Resolution Order در پایتون

هر کلاس در پایتون، از کلاس object مشتق شده است. این، پایه‌ای‌ترین نوع در پایتون است.

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

1# Output: True
2print(issubclass(list,object))
3
4# Output: True
5print(isinstance(5.5,object))
6
7# Output: True
8print(isinstance("Hello",object))

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

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

بدین شکل، اطمینان حاصل می‌شود که یک کلاس همیشه پیش از والدین خود ظاهر می‌شود و در صورت وجود چندین والد، ترتیب مشابه «تاپل» (Tuple) کلاس مبنا است. MRO از یک کلاس را می‌توان به عنوان خصیصه __mro__ یا روش ()mro در نظر گرفت. اولی یک تاپل را باز می‌گرداند، در حالی که خروجی دومین مورد یک لیست است.

1>>> MultiDerived.__mro__
2(<class '__main__.MultiDerived'>,
3 <class '__main__.Base1'>,
4 <class '__main__.Base2'>,
5 <class 'object'>)
6
7>>> MultiDerived.mro()
8[<class '__main__.MultiDerived'>,
9 <class '__main__.Base1'>,
10 <class '__main__.Base2'>,
11 <class 'object'>]

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

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

1class X: pass
2class Y: pass
3class Z: pass
4
5class A(X,Y): pass
6class B(Y,Z): pass
7
8class M(B,A,Z): pass
9
10# Output:
11# [<class '__main__.M'>, <class '__main__.B'>,
12# <class '__main__.A'>, <class '__main__.X'>,
13# <class '__main__.Y'>, <class '__main__.Z'>,
14# <class 'object'>]
15
16print(M.mro())

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

[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]
بر اساس رای ۷ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Programiz
نظر شما چیست؟

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