خانه / آموزش‌ها / کلاس‌های انتزاعی در پایتون (Abstract Base Classes)

کلاس‌های انتزاعی در پایتون (Abstract Base Classes)

🐍 HomeOfPython
|
📅 1404/10/22

سطح مقدماتی (Beginner Level)

زمانی که در پایتون برنامه‌نویسی شی‌گرا (OOP) انجام می‌دهید، گاهی نیاز دارید کلاسی بسازید که نقش یک «نقشه راه» یا «الگو» را بازی کند. این کلاس قرار نیست خودش مستقیماً استفاده شود (Instance ساخته شود)، بلکه قرار است به سایر کلاس‌ها بگوید چه متدهایی را باید حتماً پیاده‌سازی کنند.

به این کلاس‌ها، کلاس انتزاعی یا Abstract Base Class (ABC) می‌گوییم.

مفهوم انتزاع (Abstraction)

انتزاع یعنی پنهان کردن جزئیات پیاده‌سازی و تمرکز روی عملکرد کلی. در پایتون برای استفاده از این قابلیت باید از ماژول استاندارد abc استفاده کنیم.

دو قانون اصلی:

  1. از کلاس انتزاعی نمی‌توان نمونه (Object) ساخت.
  2. هر کلاسی که از کلاس انتزاعی ارث‌بری کند، مجبور است تمام متدهای انتزاعی (@abstractmethod) را پیاده‌سازی کند.

ساخت اولین کلاس انتزاعی

برای ساخت یک ABC، کلاس شما باید از ABC ارث‌بری کند و متدهایی که می‌خواهید اجباری باشند را با دکوریتور @abstractmethod مشخص کنید.

python
# Static: تعریف ساختار (به تنهایی اجرا نمی‌شود چون هدفش ارث‌بری است)
from abc import ABC, abstractmethod

class Vehicle(ABC):
    @abstractmethod
    def start_engine(self):
        """این متد حتما باید در کلاس فرزند پیاده‌سازی شود"""
        pass

    def description(self):
        """این یک متد معمولی است و اجباری برای تغییر آن نیست"""
        return "This is a vehicle."

مثال اول: پیاده‌سازی صحیح

در اینجا می‌بینیم که چگونه کلاس‌های Car و Motorcycle مجبور می‌شوند متد start_engine را داشته باشند.

Python

مثال دوم: خطای عدم پیاده‌سازی (Enforcement)

اگر کلاسی از Vehicle ارث‌بری کند اما متد start_engine را ننویسد، پایتون اجازه ساخت آبجکت از آن را نمی‌دهد. این ویژگی تضمین می‌کند که کدهای شما ناقص نمی‌مانند.

Python

سطح پیشرفته (Professional Level)

در پروژه‌های بزرگ، فریم‌ورک‌سازی و معماری تمیز (Clean Architecture)، استفاده از ABCها حیاتی است. آن‌ها به عنوان Interface (رابط) عمل می‌کنند و قراردادهایی (Contracts) را بین بخش‌های مختلف سیستم ایجاد می‌کنند.

ویژگی‌های پیشرفته (@abstractproperty)

علاوه بر متدها، می‌توانید ویژگی‌ها (Properties) را نیز انتزاعی کنید. این یعنی کلاس فرزند مجبور است یک property با نام مشخص داشته باشد.

Python

ارث‌بری چندگانه و Mixins

کلاس‌های انتزاعی در ارث‌بری چندگانه (Multiple Inheritance) بسیار کاربرد دارند تا تداخل متدها را مدیریت کنند. شما می‌توانید یک کلاس داشته باشید که از چندین ABC ارث‌بری می‌کند تا ویژگی‌های مختلف را جمع‌آوری کند.

python
# Static: ساختار ارث‌بری چندگانه
class JSONSerializable(ABC):
    @abstractmethod
    def to_json(self):
        pass

class DatabaseEntity(ABC):
    @abstractmethod
    def save(self):
        pass

class User(JSONSerializable, DatabaseEntity):
    def to_json(self):
        return "{}"
    
    def save(self):
        print("Saved to DB")

متدهای انتزاعی با بدنه (Implementation in Abstract Method)

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

Python

ثبت کلاس‌های مجازی (Virtual Subclasses)

گاهی اوقات کلاسی دارید که از ABC ارث‌بری نکرده است، اما تمام متدهای لازم را دارد (Duck Typing). می‌توانید با متد register آن را به عنوان زیرمجموعه مجازی ABC ثبت کنید تا در چک‌های isinstance معتبر باشد.

Python

نکات کلیدی برای حرفه‌ای‌ها

  1. Interface Segregation Principle: به جای یک ABC بزرگ با ۱۰ متد، آن را به چند ABC کوچک تقسیم کنید.
  2. Runtime Check: استفاده از ABCها کمی سربار (Overhead) در زمان اجرا دارد، اما برای ایمنی نوع (Type Safety) و خوانایی کد ارزشش را دارد.
  3. تایپ هینتینگ: هنگام استفاده از Type Hinting، همیشه نوع ورودی‌ها را ABC قرار دهید (مثلاً Iterable به جای list) تا تابع شما انعطاف‌پذیر باشد.