مشخصات مقاله
-
623
-
0.0
-
2661
-
0
-
0
آموزش وراثت در برنامه نویسی پایتون
آموزش وراثت در برنامه نویسی پایتون
البته که یک ویژگی زبان به نام کلاس، بدون پشتیبانی از وراثت ارزش نخواهد داشت. نحوه نگارش برای تعریف یک کلاس مشتق شده به صورت زیر است:
class DerivedClassName(BaseClassName):
.
.
.
نام BaseClassName باید در حوزهی در بر دارنده تعریف کلاس مشتق شده، تعریف شود. به جای نام یک کلاس پایه، سایر عبارات دلخواه نیز مجاز است. برای مثال زمانی که کلاس پایه در ماژول دیگری تعریف شده باشد، این می تواند مفید باشد.
class DerivedClassName(modname.BaseClassName):
روند اجرای تعریف یک کلاس مشتق شده همانند کلاس پایه است. زمانی که شی کلاس ساخته شود، کلاس پایه به یاد می آید. از این برای بر طرف کردن ارجاع های ویژگی استفاده می شود. اگر یک ویژگی درخواست شده در کلاس موجود نباشد، روند جستجو به بررسی کلاس پایه می پردازد. در صورتی که خود کلاس پایه نیز از کلاس دیگری مشتق شده باشد، این قانون به صورت بازگشتی اعمال می شود.
هیچ چیز خاصی درباره نمونه گیری از کلاس های مشتق شده و جود ندارد: DerivedClassName() یک نمونه جدید از کلاس ایجاد می کند. ارجاع های متد به این صورت انجام می شوند: ویژگی کلاس مربوطه جستجو می شود، در صورت لزوم از زنجیره کلاس های پایه پایین می آید، و اگر این به یک شی تابع برسد (اگر این عملیات به نتیجه برسد)، مرجع متد معتبر است.
کلاس های مشتق شده ممکن است متدهای کلاس های پایه خود را تغییر دهند. زیرا متدها در زمان فراخوانی سایر متدهای یک شی مشابه، هیچ امتیاز خاصی ندارند. یک متد از یک کلاس پایه، که متد دیگری که در همان کلاس پایه تعریف شده است را فراخوانی کند، ممکن است به فراخوانی یک متد از یک کلاس مشتق شده که آن را تغییر داده است منجر شود. (برای برنامه نویسان C++: تمامی متدهای پایتون به طور موثری مجازی (virtual) هستند.)
متد تغییر دهنده در یک کلاس مشتق شده ممکن است در واقع به جای جایگزینی متد کلاس پایه هم نام، صرفا بخواهد آن را توسعه دهد. یک روش ساده برای فراخوانی مستقیم متد کلاس پایه وجود دارد: فقط BaseClassName.methodname(self, arguments) را صدا کنید. همچنین این گاهی برای مشتری ها نیز مفید است. (توجه داشته باشید این تنها در صورتی که کلاس پایه به عنوان BaseClassName در حوزه سراسری قابل دسترس باشد، کار می کند. )
پایتون دارای دو تابع داخلی است که با وراثت کار می کنند:
- برای بررسی نوع یک نمونه از isinstance() استفاده کنید: تنها در صورتی که obj.__class__ ، int باشد یا کلاسی مشتق شده از int ، isinstance(obj, int)، True خواهد بود.
- برای بررسی وراثت کلاس از issubclass() استفاده کنید: issubclass(bool, int) ، True است زیرا bool زیر کلاس int است. اگر چه issubclass(float, int) ، False است زیرا float زیر کلاس int نیست.
آموزش وراثت چندگانه در Python
همچنین پایتون از گونه ای از وراثت چندگانه (multiple inheritance) پشتیبانی می کند. تعریف یک کلاس با چندین کلاس پایه به صورت زیر است:
class DerivedClassName(Base1, Base2, Base3):
.
.
.
برای بیشتر مقاصد، در ساده ترین حالت، می توانید جستجو برای ویژگی های به ارث رسیده از یک کلاس والد را به صورت اول-عمق، چپ –به- راست، در نظر بگیرید که در یک کلاس مشابه که همپوشانی در سلسله مراتب وجود دارد دو بار جستجو نکنید. بنابراین، اگر یک ویژگی در DerivedClassName یافت نشود، در Base1 جستجو شده است، سپس (به صورت بازگشتی) در کلاس پایه Base1 جستجو شده است، و اگر در آنجا نیز یافت نشود، در Base2 جستجو می شود و این روند ادامه دارد.
در حقیقت قضیه کمی پیچیده تر از این است. ترتیب وضوح متد، برای پشتیبانی از فراخوانی های مشارکتی super() به صورت پویا تغییر می کند. این روند در سایر زبان های وراثت چندگانه با عنوان فراخوانی متد بعدی (call-next-method ) شناخته شده است و بسیار قدرتمند تر از فراخوانی super() موجود در زبان های تک وراثتی است.
از آنجایی که همه موارد وراثت چندگانه، یک یا چند رابطه لوزی گون (جایی که حد اقل یکی از کلاس های والد می تواند از طریق چندین مسیر از پایین ترین کلاس دسترس پذیر باشد). را ارائه می کنند، مرتب سازی پویا ضروری است . برای مثال، تمامی کلاس ها از object ارث می برند، بنابراین هر موردی از وراثت چندگانه، بیشتر از یک مسیر برای دستیابی به object را فراهم می کند. برای جلوگیری از دسترسی به کلاس های پایه، بیشتر از یک بار، الگوریتم پویا به گونه ای ترتیب جستجو را خطی می کند که ترتیب چپ به راست مشخص شده در هر کلاس، که هر والد را فقط یک بار صدا میزند، را حفظ کند، و این یکنواخت است (به این معنی که یک کلاس می تواند بدون اثر گذاری روی ترتیب حق تقدم والدین خود، زیر کلاس شود). همه این ویژگی ها با هم، طراحی کلاس های قابل اطمینان و قابل توسعه با وراثت چندگانه را امکان پذیر می کند.