وراثت در پایتون — توضیح به زبان ساده

عکس شاخص وراثت در پایتون

وراثت در پایتون «Inheritance» یک مفهوم کلیدی در برنامه‌نویسی شی‌گرا است که به ما این امکان را می‌دهد تا کلاس‌های جدید را بر اساس کلاس‌های موجود ایجاد کنیم. پایتون، به‌عنوان یک زبان شی‌گرا، از وراثت پشتیبانی می‌کند. بنابراین، درک انواع مختلف وراثت در پایتون برای نوشتن کدهای کارآمد و قابل نگهداری ضروری است. در پایتون، وراثت به زیرکلاس‌ها این امکان را می‌دهد تا متدها و ویژگی‌های کلاس مرجع (والد) خود را به ارث ببرند. ایجاد کدهای کارآمد یعنی استفاده مجدد از کدها هنگام تعریف کلاس‌های خاص‌تر که برخی ویژگی‌ها و متدها را از کلاس والد خود به ارث می‌برند.

مقدمه

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

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

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

# Parent class
class Animal:
    def __init__(self, name):
        self.name = name  # Initialize the name attribute

    def speak(self):
        pass  # Placeholder method to be overridden by child classes

# Child class inheriting from Animal
class Dog(Animal):
    def speak(self):
        return f"{self.name} barks!"  # Override the speak method

# Creating an instance of Dog
dog = Dog("Buddy")
print(dog.speak())  # Output: Buddy says Woof!

خروجی:

Buddy barks!
  • Animal کلاس والد است که شامل متد __init__ و متد speak است.
  • Dog کلاس فرزند است که از کلاس Animal ارث می‌برد.
  • متد speak در کلاس Dog بازنویسی شده است تا رفتار خاصی ارائه دهد.

بیایید وراثت در پایتون را به‌طور کامل‌تر بررسی کنیم، سینتکس برای وراثت در پایتون به شکل زیر است:

class ParentClass:


    # Parent class code here


    pass


class ChildClass(ParentClass):


    # Child class code here


    pass

آشنایی با انواع کلاس‌های وراثت در پایتون

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

کلاس والد در پایتون

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

کلاس فرزند در پایتون

  • این کلاس مشتق‌ شده است که از کلاس والد ارث می‌برد.
  • نحوۀ نوشتن وراثت به این صورت است: class ChildClass(ParentClass).
  • کلاس فرزند به طور خودکار تمامی ویژگی‌ها و متدهای کلاس والد را دریافت می‌کند مگر اینکه آن‌ها را بازنویسی کند.

ایجاد یک کلاس والد در پایتون

در برنامه‌نویسی شی‌گرا، یک کلاس والد ویژگی‌ها و متدهای مشترکی را تعریف می‌کند که می‌توانند توسط کلاس‌های دیگر به ارث برده شوند. این ویژگی‌ها و متدها به‌عنوان اساس برای کلاس‌های فرزند عمل می‌کنند. با استفاده از وراثت، کلاس‌های فرزند می‌توانند به ویژگی‌ها و متدهای کلاس والد دسترسی داشته و آن‌ها را گسترش دهند. در اینجا یک مثال آورده شده است که در آن Person کلاس والد است:

# A Python program to demonstrate inheritance
class Person(object):
  
  # Constructor
  def __init__(self, name, id):
    self.name = name
    self.id = id

  # To check if this person is an employee
  def Display(self):
    print(self.name, self.id)


# Driver code
emp = Person("Satyam", 102) # An Object of Person
emp.Display()

خروجی:

Satyam 102

ایجاد یک کلاس فرزند در پایتون

کلاس فرزند کلاسی است که ویژگی‌ها و متدهای خود را از کلاس والد به ارث می‌برد. کلاس فرزند همچنین می‌تواند ویژگی‌ها و متدهای اضافی معرفی کند یا حتی آن‌هایی را که از والد به ارث برده است بازنویسی کند.

در اینجا، Emp کلاس فرزند است که از کلاس Person ارث می‌برد:

class Emp(Person):
  
  def Print(self):
    print("Emp class called")
    
Emp_details = Emp("Mayank", 103)

# calling parent class function
Emp_details.Display()

# Calling child class function
Emp_details.Print()
  • کلاس Emp ویژگی‌های name و id و همچنین متد display را از کلاس Person به ارث می‌برد.
  • متد __init__ در Emp با استفاده از super().__init__(name, id) سازنده کلاس Person را فراخوانی می‌کند تا ویژگی‌های ارثی را مقداردهی اولیه کند.
  • کلاس Emp یک ویژگی اضافی به نام rol معرفی می‌کند و همچنین متد display را بازنویسی می‌کند تا علاوه بر نام و شناسه، نقش (role) را نیز چاپ کند.

متد ()__init__ در پایتون

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

در مثال فوق، متد ()__init__ در کلاس Employee اطمینان حاصل می‌کند که هم ویژگی‌های ارثی و هم ویژگی‌های جدید به‌درستی مقداردهی اولیه شوند.

# Parent Class: Person
class Person:
    def __init__(self, name, idnumber):
        self.name = name
        self.idnumber = idnumber

# Child Class: Employee
class Employee(Person):
    def __init__(self, name, idnumber, salary, post):
        super().__init__(name, idnumber)  # Calls Person's __init__()
        self.salary = salary
        self.post = post
  • متد ()__init__ در کلاس Person ویژگی‌های name و idnumber را مقداردهی اولیه می‌کند.
  • متد ()__init__ در کلاس Employee با فراخوانی super().__init__(name, idnumber) نام و شناسه را که از کلاس Person به ارث برده شده‌اند، مقداردهی اولیه می‌کند و سپس ویژگی‌های جدیدی مانند salary و post را اضافه می‌کند.

متد ()super در پایتون

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

# Parent Class: Person
class Person:
    def __init__(self, name, idnumber):
        self.name = name
        self.idnumber = idnumber

    def display(self):
        print(self.name)
        print(self.idnumber)

# Child Class: Employee
class Employee(Person):
    def __init__(self, name, idnumber, salary, post):
        super().__init__(name, idnumber)  # Using super() to call Person's __init__()
        self.salary = salary
        self.post = post
  • متد ()super در داخل متد ()__init__ کلاس Employee برای فراخوانی سازنده کلاس Person و مقداردهی اولیه ویژگی‌های ارثی «نام و شناسه» استفاده می‌شود.
  • این کار تضمین می‌کند که قابلیت‌های کلاس والد بدون نیاز به بازنویسی کد در کلاس فرزند مجددا استفاده شوند.

اضافه کردن ویژگی‌ ها در کلاس پایتون

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

# Parent Class: Person
class Person:
    def __init__(self, name, idnumber):
        self.name = name
        self.idnumber = idnumber

    def display(self):
        print(self.name)
        print(self.idnumber)

# Child Class: Employee
class Employee(Person):
    def __init__(self, name, idnumber, salary, post):
        super().__init__(name, idnumber)
        self.salary = salary
        self.post = post
  • کلاس Person دارای ویژگی‌های name و idnumber است.
  • کلاس Employee ویژگی‌های salary و post را اضافه می‌کند.
  • ویژگی‌ها هنگام ایجاد شیء مقداردهی اولیه می‌شوند و داده‌های خاص مربوط به کلاس‌های Person و Employee را نمایش می‌دهند.

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

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

  1. وراثت تک‌سطحی (Single Inheritance): یک کلاس فرزند از یک کلاس والد ارث می‌برد.
  2. وراثت چندگانه (Multiple Inheritance): یک کلاس فرزند از بیش از یک کلاس والد ارث می‌برد.
  3. وراثت چندسطحی (Multilevel Inheritance): یک کلاس از کلاسی مشتق می‌شود که خود از کلاس دیگری مشتق شده است.
  4. وراثت سلسله‌مراتبی (Hierarchical Inheritance): چندین کلاس از یک کلاس والد واحد ارث می‌برند.
  5. وراثت ترکیبی (Hybrid Inheritance): ترکیبی از بیش از یک نوع وراثت.
# ۱. Single Inheritance
class Person:
    def __init__(self, name):
        self.name = name

class Employee(Person):  # Employee inherits from Person
    def __init__(self, name, salary):
        super().__init__(name)
        self.salary = salary

# ۲. Multiple Inheritance
class Job:
    def __init__(self, salary):
        self.salary = salary

class EmployeePersonJob(Employee, Job):  # Inherits from both Employee and Job
    def __init__(self, name, salary):
        Employee.__init__(self, name, salary)  # Initialize Employee
        Job.__init__(self, salary)            # Initialize Job

# ۳. Multilevel Inheritance
class Manager(EmployeePersonJob):  # Inherits from EmployeePersonJob
    def __init__(self, name, salary, department):
        EmployeePersonJob.__init__(self, name, salary)  # Explicitly initialize EmployeePersonJob
        self.department = department

# ۴. Hierarchical Inheritance
class AssistantManager(EmployeePersonJob):  # Inherits from EmployeePersonJob
    def __init__(self, name, salary, team_size):
        EmployeePersonJob.__init__(self, name, salary)  # Explicitly initialize EmployeePersonJob
        self.team_size = team_size

# ۵. Hybrid Inheritance (Multiple + Multilevel)
class SeniorManager(Manager, AssistantManager):  # Inherits from both Manager and AssistantManager
    def __init__(self, name, salary, department, team_size):
        Manager.__init__(self, name, salary, department)        # Initialize Manager
        AssistantManager.__init__(self, name, salary, team_size)  # Initialize AssistantManager

# Creating objects to show inheritance

# Single Inheritance
emp = Employee("John", 40000)
print(emp.name, emp.salary)

# Multiple Inheritance
emp2 = EmployeePersonJob("Alice", 50000)
print(emp2.name, emp2.salary)

# Multilevel Inheritance
mgr = Manager("Bob", 60000, "HR")
print(mgr.name, mgr.salary, mgr.department)

# Hierarchical Inheritance
asst_mgr = AssistantManager("Charlie", 45000, 10)
print(asst_mgr.name, asst_mgr.salary, asst_mgr.team_size)

# Hybrid Inheritance
sen_mgr = SeniorManager("David", 70000, "Finance", 20)
print(sen_mgr.name, sen_mgr.salary, sen_mgr.department, sen_mgr.team_size)

خروجی:

John 40000
Alice 50000
Bob 60000 HR
Charlie 45000 10
David 70000 Finance 20

نتیجه گیری

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


سوالات متداول


وراثت در پایتون چیست؟

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

چگونه می‌توان یک کلاس فرزند ایجاد کرد؟

برای ایجاد یک کلاس فرزند در پایتون، کافی است کلاس فرزند را به شکل class ChildClass(ParentClass) تعریف کنید که در آن ParentClass کلاس والد و ChildClass کلاس فرزند است.

آیا یک کلاس فرزند می‌تواند متدهای کلاس والد را بازنویسی کند؟

بله، کلاس فرزند می‌تواند متدهای کلاس والد را بازنویسی کند. این کار به کمک مفهوم بازنویسی متد (method overriding) انجام می‌شود.

چه زمانی باید از متد super() استفاده کرد؟

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

چه تفاوتی بین وراثت چندگانه و ترکیبی وجود دارد؟

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

آیا می‌توان از ویژگی‌ها و متدهای کلاس والد بدون تغییر در کلاس فرزند استفاده کرد؟

بله، با استفاده از وراثت، کلاس فرزند به‌طور خودکار ویژگی‌ها و متدهای کلاس والد را دریافت می‌کند و می‌تواند از آن‌ها استفاده کند.

میزان رضایتمندی
لطفاً میزان رضایت خودتان را از این مطلب با دادن امتیاز اعلام کنید.
[ امتیاز میانگین 0 از 0 نفر ]
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع و مراجع:
مجله پی استور geeksforgeeks w3schools tutorialspoint

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *



برچسب‌ها:
پایتون


پیمایش به بالا