آموزش پایتون - انتزاع

انتزاع یکی از اصول مهم برنامه‌نویسی شیءگرا است. این مفهوم به رویکردی در برنامه‌نویسی اشاره دارد که در آن فقط داده‌های مرتبط با یک شیء در دسترس قرار می‌گیرند و تمام جزئیات دیگر پنهان می‌مانند. این رویکرد به کاهش پیچیدگی و افزایش کارایی فرایند توسعه برنامه کمک می‌کند.

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

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

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

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

ایجاد یک کلاس انتزاعی

برای ایجاد یک کلاس انتزاعی در پایتون، این کلاس باید از کلاس ABC که در ماژول ABC تعریف شده است، ارث‌بری کند. این ماژول در کتابخانه استاندارد پایتون موجود است. علاوه بر این، کلاس باید حداقل یک متد انتزاعی داشته باشد. متد انتزاعی متدی است که نمی‌توان آن را مستقیماً فراخوانی کرد، اما می‌توان آن را بازنویسی کرد. برای این کار باید دکوراتور @abstractmethod را به آن اختصاص دهید.

مثال: ایجاد یک کلاس انتزاعی

from abc import ABC, abstractmethod
class demo(ABC):
   @abstractmethod
   def method1(self):
      print ("abstract method")
      return
   def method2(self):
      print ("concrete method")

کلاس demo از کلاس ABC ارث‌بری می‌کند. این کلاس دارای متد method1() است که یک متد انتزاعی محسوب می‌شود. توجه داشته باشید که کلاس می‌تواند متدهای دیگری نیز داشته باشد که انتزاعی نیستند و به آن‌ها متدهای عینی گفته می‌شود.

اگر سعی کنید یک شیء از کلاس demo ایجاد کنید، پایتون خطای TypeError را ایجاد می‌کند:

   obj = demo()
         ^^^^^^
TypeError: Can't instantiate abstract class demo with abstract method method1

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

TypeError: Can't instantiate abstract class concreteclass with abstract method method1

بازنویسی متد انتزاعی

بنابراین، مثال زیر کلاس فرزندی را نشان می‌دهد که متد انتزاعی آن بازنویسی شده است:

مثال

from abc import ABC, abstractmethod
class democlass(ABC):
   @abstractmethod
   def method1(self):
      print ("abstract method")
      return
   def method2(self):
      print ("concrete method")

class concreteclass(democlass):
   def method1(self):
      super().method1()
      return

obj = concreteclass()
obj.method1()
obj.method2()

خروجی

با اجرای این کد، خروجی زیر تولید می‌شود:

abstract method
concrete method

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.