Python Inheritance

وراثت

وراثت این امکان را برای ما فراهم می‌کند تا بتوانیم کلاسی را تعریف کنیم که همه خصوصیات و توابع شیء کلاس دیگری را به ارث ببرد.

کلاس والد (parent class): کلاسی است که از آن به ارث برده می‌شود و گاهی به آن کلاس پایه (base class) نیز گفته می‌شود.

کلاس فرزند (child class): کلاسی است که از کلاسی دیگر ارث می‌برد. به آن کلاس مشتق شده (derived class) نیز گفته می‌شود.

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

هر کلاسی می‌تواند یک کلاس والد باشد. بنابراین نحوه نوشتن آن مانند هر کلاس دیگری است.


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 همان خواص و خصوصیات کلاس Person را دارد.


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

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

class Student(Person):
  pass

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

خروجی:

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

تا الان کلاس فرزندی ساختیم که خصوصیات و توابع شیء کلاس دیگری را به ارث می‌برد. حال می‌خواهیم تابع __init__() را به آن اضافه کنیم.

دق داشتهباشید که هر زمان شیء از کلاس ساخته شود تابع __init__() به صورت اتوماتیک فراخوانده می‌شود.
class Student(Person):
    def __init__(self, fname, lname):
        #add properties etc.

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

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

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

تا اینجا موفق شدیم که تابع __init__() را به کلاس فرزند اضافه کنیم در حالیکه همچنان از تابع __init__() کلاس والد هم به ارث می‌برد. در مرحله بعد آماده‌ایم تا به عملکرد این تابع اضافه کنیم.

تابع ()super

با استفاده از تابع super() هم می‌توان کاری کرد که کلاس فرزند همه خصوصیات و توابع شیء کلاس والد را به ارث ببرد.

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

با استفاده از تابع super() دیگر نیازی به استفاده از اسم کلاس والد نیست و کلاس فرزند به صورت خودکار همه خصوصیات و توابع شیء کلاس والد را به ارث می‌برد.

اضافه کردن خصوصیات

در کد زیر خصوصیت graduationyear را به کلاس Student اضافه کرده ایم.


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

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

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

x = Student("Mike", "Olsen", 2019)
print(x.graduationyear)

خروجی:

اضافه کردن تابع شیء

در کد زیر تابع شیء welcome را به کلاس Student اضافه کرده ایم.


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

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

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

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

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

خروجی:

دقت داشته باشید که اگر تابع شیء‌ای درست کنید که هم نام با تابع شیء موجود در کلاس والد باشد، تابع شیء کلاس والد را نادیده می‌گیرد.