وراثت و ارث بری در پایتون
در مقالهی تعریف کلاس در پایتون، نحوهی تعریف کلاس و ایجاد اشیا را به صورت عملی و با مثالهای ساده توضیح دادیم. در این مقالهی ارثبری و وراثت در پیاتون را توضیح خواهیم داد.
وراثت در پایتون یکی از مهمترین مباحث در برنامه نویسی شی گرا است. با استفاده از وراثت شما میتوانید از کدهایی که در کلاسهای قبلی تعریف کردهاید استفاده نمایید. برای این کار کافی است یک کلاس تعریف کنید که متدها و خواص کلاس مورد نیاز و مورد نطر شما را به ارث ببرد.
وراثت در پایتون با دو مفهوم کلاس والد و کلاس وارث معرفی میشود.
کلاس والد(Parent class): این کلاس کلاسی است که کلاسهای وارث کدهایش را به ارث میبرند و دیگر نیاز نیست خواص و توابع(تعریف تابع در پایتون) آن را در کلاس وارث دوباره تعریف کنید و شما بدون تعریف میتوانید کدهای این کلاس را استفاده نمائید.
کلاس وارث یا فرزند(Child class): کلاس وارث کلاسی است که کدها (خواص و توابع) کلاس وارث را به ارث میبرد و شما میتوانید بدون تعریف از خواص و متدهای کلاس والد در کلاس وارث استفاده نمائید.
برای استفاده از وراثت در پایتون ابتدا باید یک کلاس والد ایجاد نمائید و سپس کلاس یا کلاسهای فرزند را با استفاده از این کلاس بسازید. در مثالهای ریز این موضوع را بیشتر و واضح تر توضیح خواهیم داد.
تعریف کلاس والد در پایتون
برای اینکه بتوانید از یک کلاس در پایتون به عنوان کلاس والد استفاد کنید تمهید و سینتکس خاصی نیاز نیست و هر کلاسی میتواند به عنوان یک کلاس والد در پایتون استفاده گردد.
در تکه کد زیر کلاس شخص با دو خاصیت نام و نام خانوادگی و یک متد یا تابع برای چاپ نام و نام خوانوادگی شخص ایجاد کردهایم که در ادامه به عنوان کلاس والد استفاده خواهیم کرد.
class Person:
def __init__(self, fname, lname):
self.firstname = fname
self.lastname = lname
def printname(self):
print(self.firstname + ' ' + self.lastname)
x = Person('amir', 'hassanzadeh')
x.printname()
#result: amir hassanzadeh
تعریف کلاس فرزند در پایتون
برای تعریف یک کلاس فرزند از کلاس دیگر و استفاده از عمکرد کلاس والد بدون تکرار و نوشتن دوبارهی کدها کافیست کلاس والد را به عنوان پارامتر به کلاس فرزند ارسال نمائید در این صورت کلاس فرزند تمامی عمکردهای کلاس والد را به ارث میبرد و به راحتی میتوانید از خواص و توابع کلاس والد را در کلاس فرزند داشته باشید.
در مثال زیر یک کلاس دانشآموز را تعریف کردهایم که هیچ کدی ندارد و خواص و متد کلاس شخص را که در مثال بالا تعریف کردهایم را به ارث برده است.(دو کلاس به قسمتهای مختلف حافظه رم اشاره میکنند لذا تغییر مقادیر خواص یک کلاس والد در کلاس وارث هیچ تاثیری نخواهد داشت و بالعکس)
class Student(Person):
pass
y = Student('ali', 'talebi')
y.printname()
#result: ali sahebi
x.printname()
#result: amir hassanzadeh
جهت تعریف کلاس بدون کد باید از کلمهی کلیدی pass در پایتون استفاده نمائید.
افزودن سازنده یا متد __init__ به کلاس فرزند در پایتون
نحوهی ارثبری یک کلاس از کلاس دیگر در پایتون را در مثالهای بالا مشاهده نمودید. حالا میخواهیم چند خط کد و در اینجا به طور مشخص سازنده یا تابع __init__ را به کلاس وارث یا فرزند اضافه کنیم. ابتدا باید کلمهی کلیدی pass را در کلاس فرزند حذف نمائید، این کلمه فقط برای تعریف و پیاده سازی کلاسهایی است که هیچ کدی ندارند.
تابع __init__ موقع ایجاد شی مورد نظر از کلاس به صورت خودکار فراخوانی و اجرا میشود.
class Student(Person):
__init__(self, fname, lastname)
#add properites and etc
بعد از تعریف تابع __init__ در کلاس فرزند، این کلاس(کلاس فرزند) دیگر این تابع(__init__) را از کلاس وارث به ارث نمیبرد و برنامه نویس باید عمکردهای(خواص و کدها) مورد نیاز را دوباره تعریف کند.
با توجه به این که کلاس فرزند به طور مستقل تابع سازنده (__init__) خود را دارد و دیگر از تابع __init__ والد استفاده نمیکند به تعریف دوبارهی یک متد یا یک متغیر در کلاس فرزند که در کلاس والد نیز تعریف شده است را بازنویسی (overrides) میگویند.
اگر میخواهید تابع __init__ کلاس والد را در کلاس فرزند به ارث ببرید باید تابع __init__ کلاس والد در در بدنهی تابع __init__ فراخوانی نمائید. در تکه کد زیر این کار را انجام دادهایم:
class Student(Person):
def __init__(self, fname, lname):
Person.__init__(self, fname, lname)
به این صورت ما عمکردها و کدهای تابع __init__ والد را به کلاس فرزند اضافه کردیم و میتوانیم نتیجهی مورد نظر را داشته باشیم.
کدهایی که تا این قسمت نوشیم را میتوانید با کلیک روی دکمهی زیر دانلود نمائید.
تابع super در پایتون
وراثت در پایتون پایتون روش دیگری برای ارثبری عمکردهای کلاس والد در کلاس فرزند دارد. این روش با استفاده از تابعی به نام super قابل انجام است. با استفاده از این تابع دیگر نیاز نیست برای ارث بری عمکردها و از نام کلاس والد استفاده کنید و کافیست با استفاده از تابع super تابع مورد نظر را فراخوانی نمائید. در ادامهی کدهای قبلی کلاس دانشآموز را به صورت زیر تغییر میدهیم.
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
اگر از تابع super استفاده کنید دیگری نیازی به استفاده از نام کلاس والد نخواهید داشت.
افزودن خاصیت یا متغیرها به کلاس فرزند در پایتون
افزودن متغیر به کلاس فرزند تفاوتی با کلاسهای معمولی ندارد و متغیرها و یا خواص در تابع __init__ به کلاس اضافه میگردد. در ادامه کدهای فوق سال فارغ التحصیلی را به کلاس دانشآموز اضافه کردهایم.
class Student(Person):
def __init__(self, fname, lname):
super().__init__(fname, lname)
self.graduationyear = 2019
اگر میخواهید سال فارغالتحصیلی همانند سایر متغیرها داینامیک باشد و موقع ساختن شی مقدار دهی شود میتوانید یک پارامتر دیگر برای مقدار دهی این خاصیت به متد سازنده اضافه نمائید. در ادامه کدهای فوق سازنده کلاس دانشآموز را به صورت زیرتغییر میدهیم.
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
y = Student('ali', 'talebi',2020)
افزودن متد به کلاس فرزند در پایتون
همانند خواص یا متغیرها متدها نیز در سادهترین صورت به کلاسهای فرزند اضافه میشوند. کافیست یک تابع در بدنهی کلاس تعریف کنید در این صورت این متد پس از ساخت شی مورد نظر قابل فراخوانی خواهد بود.
در ادامهی کدهای بالا تابع خوشامدگویی را به کلاس دانشآموز اضافه کردهایم
class Student(Person):
def __init__(self, fname, lname, year):
super().__init__(fname, lname)
self.graduationyear = year
def welcome(self):
print('welcom ' , self.firstname , ' ' , self.lastname , "to the class of", self.graduationyear)
y = Student('ali', 'talebi',2020)
y.welcome()
کد نهایی را میتوانید با استفاده از دکمهی زیر دانلود نمائید:
منبع: w3school
ممنون
توضیحاتتون خیلی خوب بود.
خواهش میکنم.
ممنون از توجه تون