وراثت چندگانه در پایتون – به زبان ساده
در این مطلب، مفهوم وراثت چندگانه در پایتون (Multiple Inheritance In Python) و چگونگی استفاده از آن در برنامه همراه با مثالهای متعدد تشریح شده است. همچنین، مباحث «ارثبری چندسطحی» (Multilevel Inheritance) و Method Resolution Order یا همان MRO مورد بررسی قرار گرفتهاند.
وراثت چندگانه در پایتون
مانند زبان «سیپلاسپلاس» (++C)، در «پایتون» (Python) هم یک کلاس میتواند از بیش از یک کلاس پایه مشتق شود. به این قابلیت وراثت چندگانه در پایتون گفته میشود. در وراثت چندگانه در پایتون ویژگیهای همه کلاسهای پایه در کلاس مشتق شده ارث برده شدهاند. نحو ارثبری چندگانه، مشابه ارثبری تنها است.
مثالی که در ادامه و در این راستا آمده، قابل توجه است.
در اینجا، MultiDerived از کلاسهای Base1 و Base2 مشتق شدهاند.
ارثبری چندسطحی در پایتون
از سوی دیگر، میتوان از یک کلاس مشتق شده نیز ارثبری کرد. به این کار ارثبری چندسطحی گفته میشود. این کار با هر عمقی در پایتون انجامپذیر است. در ارثبری چندسطحی، ویژگیهای کلاس مبنا و کلاس مشتق شده در یک کلاس جدید ارث برده میشوند.
مثالی همراه با بصریسازی متناظر در زیر ارائه شده است.
class Base: pass class Derived1(Base): pass class Derived2(Derived1): pass
در اینجا، Derived1 از Base و Derived2 از Derived1 مشتق شده است.
Method Resolution Order در پایتون
هر کلاس در پایتون، از کلاس object مشتق شده است. این، پایهایترین نوع در پایتون است.
بنابراین، به لحاظ فنی، همه کلاسهای دیگر، چه توکار و چه تعریف شده توسط کاربر، کلاسهای مشتق شده هستند و همه نمونههایی از کلاس ٰobject محسوب میشوند.
در سناریو ارثبری چندگانه، هر خصیصه تعیین شده ابتدا در کلاس کنونی جستجو شده است. اگر در آن کلاس پیدا نشدند، جستجو به کلاسهای والد در اولین عمق، و در ادامه ترتیب چپ-راست بدون آنکه یک کلاس دو بار جستجو شود، ادامه پیدا میکند.
بنابراین، در مثال بالا از کلاس MultiDerived، ترتیب جستجو [MultiDerived, Base1, Base2, object] است. این ترتیب، خطیسازی کلاس MultiDerived نیز نامیده میشود و مجموعه قواعدی که برای پیدا کردن آن مورد استفاده قرار میگیرد، «Method Resolution Order | MRO» نام دارد. MRO باید از مرتبسازی محلی اولویتها (Local Precedence Ordering) جلوگیری و یکنوایی (Monotonicity) را فراهم کند.
بدین شکل، اطمینان حاصل میشود که یک کلاس همیشه پیش از والدین خود ظاهر میشود و در صورت وجود چندین والد، ترتیب مشابه «تاپل» (Tuple) کلاس مبنا است. MRO از یک کلاس را میتوان به عنوان خصیصه __mro__ یا روش ()mro در نظر گرفت. اولی یک تاپل را باز میگرداند، در حالی که خروجی دومین مورد یک لیست است.
در اینجا، یک مثال از وراثت چندگانه در پایتون که نسبتا به موارد پیشین کمی پیچیدهتر است همراه با روش بصریسازی آن با بهرهگیری از MRO آموزش داده شده است.
خروجی قطعه کد بالا به صورت زیر است.
[<class '__main__.M'>, <class '__main__.B'>, <class '__main__.A'>, <class '__main__.X'>, <class '__main__.Y'>, <class '__main__.Z'>, <class 'object'>]