وراثت در پایتون «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 را نمایش میدهند.
انواع وراثت در پایتون
- وراثت تکسطحی (Single Inheritance): یک کلاس فرزند از یک کلاس والد ارث میبرد.
- وراثت چندگانه (Multiple Inheritance): یک کلاس فرزند از بیش از یک کلاس والد ارث میبرد.
- وراثت چندسطحی (Multilevel Inheritance): یک کلاس از کلاسی مشتق میشود که خود از کلاس دیگری مشتق شده است.
- وراثت سلسلهمراتبی (Hierarchical Inheritance): چندین کلاس از یک کلاس والد واحد ارث میبرند.
- وراثت ترکیبی (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
نتیجه گیری
وراثت در پایتون یکی از مفاهیم کلیدی است که به توسعهدهندگان این امکان را میدهد تا کدهای خود را بازاستفادهپذیر، انعطافپذیر و قابل گسترش کنند. با استفاده از وراثت، کلاسهای فرزند میتوانند ویژگیها و متدهای مشترک را از کلاسهای والد به ارث ببرند و در صورت نیاز آنها را بازنویسی یا گسترش دهند. انواع مختلف وراثت مانند وراثت تکسطحی، چندگانه، چندسطحی، سلسلهمراتبی و ترکیبی، امکان طراحی ساختارهای پیچیدهتر و متنوعتر را فراهم میکنند. در نهایت، تسلط بر مفاهیم وراثت به توسعه کدهای بهینه و قابل نگهداری کمک کرده و موجب افزایش بهرهوری در پروژههای نرمافزاری میشود.