وراثت یا ارث بری در پایتون (Python inheritance)

وراثت یا ارث بری در پایتون (Python inheritance)

بحث شی گرایی در پایتون با مبحث کلاس ها و اشیاء شروع شد و مباحث زیادی را در ادامه درباره شی گرایی یاد می گیرید. یکی از مباحث مهم و اساسی دیگر در بحث شی گرایی، مبحث وراثت است که در این مقاله با آن به طور مفصل آشنا خواهید شد. وراثت به ما اجازه می دهد تا یک کلاس جدید ایجاد کنیم که تمام متدها و خصوصیاتش را از کلاس دیگری به ارث برده باشد.

در مبحث وراثت ما دو اصطلاح اصلی داریم :

  1. کلاس والد (Parent Class)
  2. کلاس فرزند (Child Class)

کلاس والد (Parent Class) کلاسی است که یک کلاس دیگر از آن ارث می برد که به آن کلاس پایه (base Class) نیز می گویند.

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

زمان مطالعه: 3 دقیقه
بازدید: 1951
پرسش و پاسخ: 0

ارث بری و ایجاد یک کلاس والد (Parent Class) در پایتون

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

مثال: در این مثال یک کلاس با نام Person با دو خصوصیت firstname و lastname و یک متد با نام printname ایجاد کرده ایم.

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()

بحث ارث بری و ایجاد یک کلاس والد (Parent Class) در پایتون (Python)

ایجاد یک کلاس فرزند (Child Class)

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

مثال: در این مثال یک کلاس با نام Student را ایجاد کرده که تمام قابلیت های کلاس Person را به ارث می برد.

class Student(Person):
  pass

نکته: کلمه کلیدی pass که قبلا هم گفتیم برای بلوک کلاسی است که فاقد دستور و محتوا است که از بروز خطا جلوگیری کند.

حال کلاس Student همه متدها و خصوصیات کلاس Person را دارد.

مثال: در این مثال از کلاس Student یک شی ایجاد می کند و سپس متد printname را که از متدهای کلاس Person است اجرا می کند.

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

ایجاد یک کلاس فرزند (Child Class) در پایتون (Python)

افزودن تابع ()__init__

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

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

نکته: همانطور که قبلا هم گفتیم هر بار که کلاس برای ایجاد یک شی استفاده می شود، تابع ()__init__ به طور خودکار فراخوانی می شود.

مثال: در این مثال تابع ()__init__ را به کلاس Student اضافه می کنیم.

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__ در پایتون (Python)

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

استفاده از تابع ()super

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

مثال: در این مثال برای ارث بری از کلاس والد از تابع ()super استفاده کرده ایم.

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

استفاده از تابع ()super در پایتون (Python)

با استفاده از تابع ()super نیازی به استفاده از نام عنصر کلاس والد نیست، این تابع به طور خودکار تمام متدها و خصوصیات را از کلاس والد به ارت می برد.

افزودن خصوصیت

شرح این موضوع را با ذکر مثالی برای شما شرح می دهیم.

مثال: در این مثال خصوصیتی با نام gradiuationyear (فارغ التحصیلی) به کلاس Student اضافه می کند.

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

افزودن خصوصیت در پایتون (Python)

در مثال زیر سال 2019  باید یک متغیر باشد و هنگام ایجاد شی از کلاس Student به داخل آن پاس داده شود، برای ایجاد این کار یک پارامتر دیگر در تابع ()__init__ اضافه کنید.

مثال: در این مثال پارامتر year را به تابع ()__init__ کلاس Student اضافه می کنیم و مقدار پارامتر year را هنگام ایجاد شی به آن پاس می دهیم.

class Student(Person):
  def __init__(self, fname, lname, year):
    super().__init__(fname, lname)
    self.graduationyear = year
x = Student("Mike", "Olsen", 2019)

افزودن خصوصیت در پایتون (Python)

افزودن متد

شرح این موضوع را نیز مانند بحث افزودن خصوصیت با ذکر مثالی برای شما شرح می دهیم.

مثال: در این مثال متدی با نام Welcome را به کلاس Student اضافه می کنیم.

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)

افزودن متد در پایتون (Python)

اگر متدی را در کلاس فرزند با نام متدی در کلاس والد یکی باشد متد کلاس فرزند در متد کلاس والد بازنویسی یا به اصطلاح override می شود و متد کلاس والد نادیده گرفته می شود.

خب در این مقاله به طور مفصل مبحث وراثت در پایتون را برای شما شرح دادیم.

در مقاله بعدی به مبحث مهم و کاربردی iterators (متغیرهای قابل پیمایش) را برای شما شرح خواهیم داد.

مطالعه دقیقتر در مورد شی گرایی: شی گرایی چیست؟

بهزاد میرزازاده
مسیر درست با پرسش های درست ساخته می شود

مشاهده تمام مطالب نویسنده