ویدیو آموزش وراثت چندگانه و MRO در پایتون

امیرحسین بیگدلو April 2023

نکته

این ویدیو آموزش وراثت چندگانه پایتون هست، اگر به دنبال آموزش وراثت معمولی هستید، میتونید ویدیو آموزش ارثبری در پایتون رو ببینید.

 

در این آموزش به بررسی وراثت چند گانه و مفهوم MRO اشاره خواهد شد.

 

 #  معرفی ارثبری چندگانه در پایتون

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

 

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

 

این تعصب گسترده مبنی بر اینکه وراثت چندگانه چیزی "خطرناک" یا "بد" است، بیشتر توسط زبان های برنامه نویسی با مکانیسم های وراثت چندگانه ضعیف پیاده سازی شده و مهمتر از همه با استفاده نادرست از آن تغذیه می شود. جاوا حتی از وراثت چندگانه پشتیبانی نمی کند، در حالی که ++C از آن پشتیبانی می کند. پایتون یک رویکرد پیچیده و به خوبی طراحی شده برای وراثت چندگانه دارد.

 

تعریف یک کلاس، که در آن یک کلاس فرزند SubClassName از کلاس‌های والد BaseClass1، BaseClass2، BaseClass3 و غیره به ارث می‌برد، به شکل زیر است:

class SubclassName(BaseClass1, BaseClass2, BaseClass3, ...):
    pass

 

واضح است که همه سوپرکلاس‌های BaseClass1، BaseClass2، BaseClass3، ... می‌توانند از دیگر سوپرکلاس‌ها نیز ارث ببرند. چیزی که به دست می آوریم یک ارثبری درختی است:

 

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

 

در ارثبری چندگانه، کلاس فرزند میتواند به تمام ویژگی های کلاس های پدر دسترسی داشته باشد. سینتکس ارثبری چندگانه مشابه ارثبری معمولی است:

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 ارثبری کرده است:

 

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

 

 

 #  توضیح MRO در پایتون

در پایتون مفهوم mro در ارثبری کاربرد دارد. method resolution order ترتیبی است که پایتون در کلاس ها به دنبال ویژگی خواسته شده میگردد.

 

در پایتون mro از پایین به بالا و از چپ به راست است. به این معنی که پایتون ویژگی خواسته شده را ابتدا در کلاس فعلی جستجو میکند. اگر یافت نشد، در کلاس پدر و همینطور به سمت بالا حرکت میکند تا به کلاس object برسد.

 

به کد زیر دقت کنید:

class A:
    pass

class B(A):
    pass

 

کد بالا یک نمونه از ارثبری معمولی است. اگر ویژگی خاصی را در کلاس B جستجو کنید که وجود ندارد، پایتون بر اساس MRO در کلاس A جستجو میکند. اگر در کلاس A هم پیدا نشد، پایتون کلاس object را بررسی میکند. کلاس object کلاس پیشفرضی است که تمام کلاس های پایتونی از آن ارثبری میکند.

 

در مثال دیگر از mro پایتون، به کد زیر دقت کنید:

class A:
	pass

class B:
	pass

class C(B, A):
	pass

 

در کد بالا، کلاس C از کلاس های A و B ارثبری میکند. این یک نمونه از ارثبری چند گانه است. در این حالت از ترتیب ارثبری روی mro تاثیر خواهد گذاشت. اگر ویژگی که در کلاس C به دنبال آن هستید پیدا نشود پایتون به کلاس B خواهد رفت چون در کلاس C ابتدا از کلاس B ارثبری کرده اید.

 

اگر میخواهید ترتیب mro را ببینید میتوانید از help روی کلاس استفاده کنید:

>>> help(C)
... 
Method resolution order:
 |      C
 |      B
 |      A
 |      builtins.object
...

 

همانطور که میبینید ترتیب mro کاملا مشخص است.

ویدیوهای مشابه



ارسال نظر


فردین ترکماند

4 ماه قبل پاسخ به نظر

استاد دم شما گرم واقعا عالی بود.

ارسال نظر



mahboobe

1 سال قبل پاسخ به نظر

باسلام و وقت بخیرو تشکر بابت مطالب خوبتون
آیا در پایتون این امکان وجود دارد که کلاس فرزند برخی از خصوصیات کلاس پدر را به ارث ببرد نه همه آنها را ؟؟

ارسال نظر



امیرحسین بیگدلو

1 سال قبل

سلام
تا جایی که من خبر دارم کلاس فرزند همه ویژگی های پدر رو به ارث میبره

Mahdi

1 سال قبل پاسخ به نظر

تشکر دستت درد نکنه گل کاشتی.

ارسال نظر



Alireza

2 سال قبل پاسخ به نظر

استاد خسته نباشید
مبحث پیچیده‌ای بود ولی با توضیحات خوبتون و تمرین کردن درکش کردم

ارسال نظر



پتی

2 سال قبل پاسخ به نظر

سلام.
عالی بود استاد

ارسال نظر



Mahdi

2 سال قبل پاسخ به نظر

سلام امیر
دست خوش پسر. وب فارسی رو توی حوزه برنامه نویسی داری می کشی بالا.
just do it, best
یدونه ویدئو درمورد متود سوپر ظبط می کنی که کامل و جامع توضیحش بدی. ممنون

ارسال نظر



مونگارد