به آموزشگاه مجازی سینا خوش آمدید!

آموزش وراثت در پایتون

امتیاز
(0)

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

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

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


ایجاد یک کلاس والد(parent)

هر کلاسی می‌تواند یک کلاس والد(parent) باشد، بنابراین سینتکس یا شیوه‌ی نوشتاری آن، مانند ایجاد کلاس‌های دیگر است:

مثال شماره 1

ایجاد یک کلاس به نام 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)

#printname برای ایجاد یک آبجکت و سپس اجرای متد Person استفاده از کلاس

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

نتیجه:

John Doe
امتحان کنید

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

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

مثال

ایجاد یک کلاس به نام Student که پروپرتی ‌ها و متدها را از کلاس Person به ارث می‌بَرَد:

class Student(Person):
  pass

نکته: وقتی که نمی‌خواهید هیچ پروپرتی یا متدی را در یک کلاس اضافه کنید، از کلمه‌ی کلیدی pass استفاده کنید. 

حالا کلاس Student پروپرتی‌ها و متدهای مشابهی، مانند کلاس Person دارد. 

مثال شماره 2

استفاده از کلاس Student برای ایجاد یک آبجکت و آنگاه، اجرا کردن متد printname:

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

نتیجه:

Mike Olsen
امتحان کنید

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

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

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

مثال شماره 3

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

class Student(Person):
  def __init__(self, fname, lname):
    #اضافه کردن پروپرتی ها و غیره

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

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

برای اینکه ارث‌بری از تابع __init__() را حفظ کنیم، کافیست تابع __init__() از کلاس والد را یکبار فراخوانی کنیم:

مثال شماره 4

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):
    Person.__init__(self, fname, lname)

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

نتیجه:

Mike Olsen
امتحان کنید

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


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

پایتون همچنین یک تابه به نام super() دارد که باعث می‌شود کلاس فرزند، تمام متدها و پروپرتی‌ها را از والد(parent) خود به ارث بَرَد:

مثال شماره 5

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):
    super().__init__(fname, lname)

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

نتیجه:

Mike Olsen
امتحان کنید

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


اضافه کردن پروپرتی‌ها

مثال شماره 6

اضافه کردن یک پروپرتی به نام 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):
    super().__init__(fname, lname)
    self.graduationyear = 2019

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

نتیجه:

2019
امتحان کنید

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

مثال شماره 7

اضافه کردن یک پارامتر به نام year و پاس دادن سال صحیح، هنگامی که آبجکت‌ها را ایجاد می‌کنیم:

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)

نتیجه:

2019
امتحان کنید

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

مثال شماره 8

اضافه کردن یک متد به نام 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", 2024)
x.welcome()

نتیجه:

Welcome Mike Olsen to the class of 2024
امتحان کنید

اگر یک متد را در کلاس فرزند اضافه کنیم، به طوری که نام یکسانی با یک تابع در کلاس والد داشته باشد، وراثت متد والد، نادیده گرفته خواهد شد(لغو خواهد شد). 

 


منبع: www.w3schools.com/python

 

  • بازدید: 69

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.

ارسال