اگر دانلود ویدیو شروع نشد، روی ویدیو راست کلیک کرده و گزینه Save Video As را انتخاب کنید.
ویدیو آموزش وراثت چندگانه و MRO در پایتون
August 2022
نکته
این ویدیو آموزش وراثت چندگانه پایتون هست، اگر به دنبال آموزش وراثت معمولی هستید، میتونید ویدیو آموزش ارثبری در پایتون رو ببینید.
در این آموزش به بررسی وراثت چند گانه و مفهوم 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 کاملا مشخص است.
mahboobe
March 2023پاسخ به نظر
باسلام و وقت بخیرو تشکر بابت مطالب خوبتون
آیا در پایتون این امکان وجود دارد که کلاس فرزند برخی از خصوصیات کلاس پدر را به ارث ببرد نه همه آنها را ؟؟
پاسخ به نظر
امیرحسین بیگدلو
March 2023سلام
تا جایی که من خبر دارم کلاس فرزند همه ویژگی های پدر رو به ارث میبره
Mahdi
November 2022پاسخ به نظر
تشکر دستت درد نکنه گل کاشتی.
پاسخ به نظر
Alireza
October 2022پاسخ به نظر
استاد خسته نباشید
مبحث پیچیدهای بود ولی با توضیحات خوبتون و تمرین کردن درکش کردم
پاسخ به نظر
پتی
May 2022پاسخ به نظر
سلام.
عالی بود استاد
پاسخ به نظر
Mahdi
January 2022پاسخ به نظر
سلام امیر
دست خوش پسر. وب فارسی رو توی حوزه برنامه نویسی داری می کشی بالا.
just do it, best
یدونه ویدئو درمورد متود سوپر ظبط می کنی که کامل و جامع توضیحش بدی. ممنون
پاسخ به نظر