البته، یک ویژگی زبان بدون پشتیبانی از وارثت ارزش نام «کلاس» را نخواهد داشت. نحو تعریف کلاس مشتقشده به این شکل است:
class DerivedClassName(BaseClassName):
.
.
.
نام BaseClassName باید در فضای نامی تعریف شده باشد که از دامنه حاوی تعریف کلاس مشتقشده در دسترس است. به جای نام کلاس پایه، عبارات دلخواه دیگر نیز مجاز هستند. این میتواند مفید باشد، مثلاً وقتی کلاس پایه در ماژول دیگری تعریف شده باشد:
class DerivedClassName(modname.BaseClassName):
اجرای یک تعریف کلاس مشتقشده دقیقاً مانند کلاس پایه انجام میشود. وقتی شیء کلاس ساخته شود، کلاس پایه به یاد آورده میشود. این برای حل مراجعات ویژگی استفاده میشود: اگر ویژگی درخواست شده در کلاس یافت نشود، جستجو به کلاس پایه ادامه مییابد. این قاعده بازگشتی اعمال میشود اگر خود کلاس پایه از کلاس دیگری مشتق شده باشد.
هیچ چیز خاصی درباره نمونهسازی کلاسهای مشتقشده وجود ندارد: DerivedClassName() یک نمونه جدید از کلاس ایجاد میکند. مراجعات متدها به شکل زیر حل میشوند: ویژگی متناظر کلاس جستجو میشود، در صورت نیاز از زنجیره کلاسهای پایه به پایین میرود، و مرجع متد معتبر است اگر یک شیء تابع تولید کند.
کلاسهای مشتقشده میتوانند متدهای کلاسهای پایه خود را بازنویسی کنند. زیرا متدها هنگام فراخوانی متدهای دیگر همان شیء هیچ امتیاز ویژهای ندارند، یک متد از کلاس پایه که متد دیگری تعریف شده در همان کلاس پایه را فراخوانی میکند ممکن است در نهایت متدی از کلاس مشتقشده که آن را بازنویسی کرده فراخوانی کند. (برای برنامهنویسان C++: تمام متدها در پایتون عملاً virtual هستند.)
یک متد بازنویسی شده در کلاس مشتقشده ممکن است در واقع بخواهد به جای جایگزینی ساده متد پایه با همان نام، آن را گسترش دهد. روش سادهای برای فراخوانی مستقیم متد کلاس پایه وجود دارد: فقط BaseClassName.methodname(self, arguments) را فراخوانی کنید.
پایتون دو تابع داخلی دارد که با وارثت کار میکنند:
isinstance() برای بررسی نوع یک نمونه استفاده کنید: isinstance(obj, int) فقط اگر obj.__class__ برابر int یا کلاسی مشتقشده از int باشد True خواهد بود.issubclass() برای بررسی وارثت کلاس استفاده کنید: issubclass(bool, int) برابر True است زیرا bool زیرکلاس int است. اما issubclass(float, int) برابر False است زیرا float زیرکلاس int نیست.پایتون از شکلی از وارثت چندگانه نیز پشتیبانی میکند. تعریف کلاس با کلاسهای پایه متعدد به این شکل است:
class DerivedClassName(Base1, Base2, Base3):
.
.
.
برای اکثر اهداف، در موارد ساده، میتوانید جستجوی ویژگیهای به ارث برده شده از یک کلاس والد را به صورت عمقاول، از چپ به راست در نظر بگیرید، و دوباره در همان کلاس جایی که همپوشانی در سلسلهمراتب وجود دارد جستجو نکنید. بنابراین، اگر ویژگی در DerivedClassName یافت نشود، در Base1 جستجو میشود، سپس (بازگشتی) در کلاسهای پایه Base1، و اگر آنجا یافت نشود، در Base2 جستجو میشود و الی آخر.
در واقع، کمی پیچیدهتر از آن است؛ ترتیب حل روش به صورت دینامیک برای پشتیبانی از فراخوانیهای مشارکتی به super() تغییر میکند. این رویکرد در برخی زبانهای دیگر وارثت چندگانه به نام فراخوانی-روش-بعدی شناخته میشود و قویتر از فراخوانی super در زبانهای وارثت تکی است.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://docs.python.org/3/tutorial