ویدیو آموزش وراثت چندگانه و MRO در پایتون
نکته
این ویدیو آموزش وراثت چندگانه پایتون هست، اگر به دنبال آموزش وراثت معمولی هستید، میتونید ویدیو آموزش ارثبری در پایتون رو ببینید.
در این آموزش به بررسی وراثت چند گانه و مفهوم 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 کاملا مشخص است.
ارسال نظر