سطح مقدماتی (Beginner Level)
وراثت (Inheritance) یکی از ارکان اصلی برنامهنویسی شیگرا (OOP) است. این قابلیت به ما اجازه میدهد کلاسی جدید بسازیم که خصوصیات (Attributes) و رفتارها (Methods) را از یک کلاس موجود به ارث میبرد.
مفهوم کلاس والد و فرزند
کلاسی که از آن ارثبری میشود کلاس والد (Parent یا Base Class) و کلاس جدید کلاس فرزند (Child یا Derived Class) نامیده میشود. این کار باعث جلوگیری از تکرار کد میشود.
مثال ۱: ساختار پایه وراثت
در این مثال، کلاس Car ویژگیهای کلاس Vehicle را به ارث میبرد.
مثال ۲: بازنویسی متدها (Method Overriding)
گاهی اوقات کلاس فرزند نیاز دارد رفتار متد کلاس والد را تغییر دهد. به این کار Overriding میگویند.
تابع super()
تابع super() پلی است که کلاس فرزند را به کلاس والد متصل میکند. کاربرد اصلی آن زمانی است که میخواهیم متد __init__ کلاس والد را درون کلاس فرزند فراخوانی کنیم تا ویژگیهای اولیه مقداردهی شوند.

مثال ۱: استفاده از super در سازنده
مثال ۲: گسترش عملکرد متد والد
میتوانید کد والد را اجرا کنید و سپس چیزی به آن اضافه کنید.
# Static Snippet: منطق گسترش متد
class Parent:
def greet(self):
print("Hello from Parent")
class Child(Parent):
def greet(self):
super().greet() # اجرای کد والد
print("Hello from Child too!")
سطح پیشرفته (Professional Level)
در سطح حرفهای، وراثت پیچیدگیهای خاص خود را دارد، از جمله وراثت چندگانه، MRO و کلاسهای انتزاعی.
وراثت چندگانه (Multiple Inheritance)
پایتون بر خلاف بسیاری از زبانها، اجازه میدهد یک کلاس از چند کلاس والد به صورت همزمان ارثبری کند.
مثال ۱: وراثت چندگانه ساده
ترتیب کاوش متدها (MRO - Method Resolution Order)
وقتی از وراثت چندگانه استفاده میکنید، اگر دو کلاس والد متدی با نام یکسان داشته باشند، پایتون کدام را اجرا میکند؟ این اولویت توسط MRO تعیین میشود (معمولاً از چپ به راست).
چندریختی (Polymorphism)
پلیمورفیسم به توانایی استفاده از یک رابط (Interface) مشترک برای انواع مختلف دادهها اشاره دارد. در OOP، یعنی متدهای همنام در کلاسهای مختلف کارهای متفاوتی انجام دهند، اما با یک روش یکسان فراخوانی شوند.
کلاسهای انتزاعی (Abstract Base Classes)
در معماری نرمافزار حرفهای، گاهی میخواهیم قالبی بسازیم که کلاسهای فرزند مجبور به پیادهسازی متدهای خاصی باشند. ماژول abc این امکان را فراهم میکند. کلاسهای Abstract به خودی خود قابل نمونهسازی نیستند.
مثال فنی: اجبار به پیادهسازی
# Static Snippet: الگوی طراحی Template Method با ABC
from abc import ABC, abstractmethod
class DataProcessor(ABC):
def process(self):
data = self.read_data()
cleaned = self.clean_data(data)
self.save_data(cleaned)
@abstractmethod
def read_data(self): pass
@abstractmethod
def save_data(self, data): pass
# متد معمولی (اختیاری برای Override)
def clean_data(self, data):
return data.strip()