Python Inheritance

ارث بری در پایتون

ارث بری در پایتون این امکان را فراهم می‌کند که کلاسی تعریف کنید که ویژگی ها و متد هایش را از کلاس دیگری به ارث برده باشد

کلاس والد (parent class)، کلاسی است که ارث بری از آن انجام می‌شود. همچنین کلاس پایه هم نامیده می‌شود.

کلاس فرزند (Child class)، کلاسی است که ویژگی ها را از کلاس دیگری (کلاس والد) به ارث می‌برد.

ساختن کلاس والد

هر کلاسی می‌تواند به عنوان کلاس والد در نظر گرفته شود. بنا براین syntax نوشتن این کلاس مانند همه کلاس های دیگری است که در پست قبلی اشاره شده

 

مثال: ایجاد یک کلاس با نام person با دو ویژگی first name , last name به همراه یک متد print name

class Person:
  def __init__(self, fname, lname):
    self.firstname = fname
    self.lastname = lname

  def printname(self):
    print(self.firstname, self.lastname)

#Use the Person class to create an object, and then execute the printname method:

x = Person("John", "Doe")
x.printname()

ایجاد کلاس فرزند

برای این که کلاسی ایجاد کنید که از کلاس دیگر ارث بری کند تنها کافی است که کلاس والد را به عنوان پارامتر به کلاس فرزند بفرستید آنگاه کلاس فرزند یک نمونه کامل از تمام توابع و ویژگی های کلاس والد را خواهد داشت.

مثال: ایجاد کلاس student که تمام ویژگی ها و متد های کلاس person را به ارث می‌برد.

class Student(Person):
  pass

​نکته: از کلمه کلیدی pass زمانی استفاده می‌شود که نمیخواهیم هیچ ویژگی و متد دیگری به کلاس اضافه کنیم.

 

حالا از کلاس student برای ایجاد یک object از کلاس person و اجرای تابع printname استفاده می‌کنیم.

x = Student("Mike", "Olsen")
x.printname()

 

اضافه کردن تابع ()__init__ به کلاس فرزند

تا کنون ما یک کلاس فرزند ایجاد کردیم که خواص و متد های کلاس والد را به ارث می‌برد.

حال تابع ()__init__ را بجای کلمه کلیدی pass به کلاس فرزند اضافه می‌کنیم.

class Student(Person):
  def __init__(self, fname, lname):
    #add properties etc.

هنگامی که تابع ()__init__ را به کلاس فرزند اضافه میکنید، کلاس فرزند دیگر تابع ()__init__ والد را به ارث نمی‌برد.

نکته: تابع ()__init__ فرزند در هنگام ارث بری روی تابع ()__init__ والد overrides  می‌شود.

اگر می‌خواهید تابع ()__init__ والد را هم به ارث ببرید باید آن را فراخوانی کنید.

class Student(Person):
  def __init__(self, fname, lname):
    Person.__init__(self, fname, lname)

 

حالا ما تابع ()__init__ فرزند را داریم و توانستیم ارث بری از والد را به طور کامل حفظ کنیم اکنون زمان آن است که از تابع ()__init__ فرزند برای اضافه کردن توابعی دیگر استفاده کنیم.

اضافه کردن ویژگی ها به فرزند

برای اینکه ویژگی مربوط به کلاس فرزند باشد باید درون تابع ()__init__ فرزند تعریف شود.

اکنون پارامتر year را برای کلاس student تعریف می‌کنیم.

class Student(Person):
  def __init__(self, fname, lname, year):
    Person.__init__(self, fname, lname)
    self.graduationyear = year

x = Student("Mike", "Olsen", 2019)

اضافه کردن متد ها

اضافه کردن متد welcome در کلاس student

class Student(Person):
  def __init__(self, fname, lname, year):
    Person.__init__(self, fname, lname)
    self.graduationyear = year

  def welcome(self):
    print("Welcome", self.firstname, self.lastname, "to the class of", self.graduationyear)

 

اگر در کلاس فرزند متدی را بسازید که هم نام با متدی در کلاس والد باشد این متد کلاس فرزند روی متد کلاس والد override می‌شود. مانند تابع ()__init__