علاقمندان به یادگیری برنامه نویسی به خصوص برنامه نویسی با زبان پایتون، حتما با مفهومی به نام شئگرایی برخورد کردهاند. شئگرایی یکی از بنیادهای مهم توسعه نرمافزارهای مدرن به حساب میآید و پایتون نیز این امکان را برای کاربران خود فراهم کرده است. شئگرایی چهار اصل مهم را شامل میشود که یکی از این اصول، «انتزاع» (Abstraction) نام دارد. در زبان برنامه نویسی پایتون برای استفاده از اصل انتزاع در شئگرایی از کلاس انتزاعی یا همان کلاس Abstract در پایتون استفاده میشود که در این مقاله به آن پرداخته شده است.
مفهوم انتزاع در شی گرایی
در برنامه نویسی شئگرا، اصل انتزاع فرآیندی است که در پی آن جزئیات پیادهسازی و عملکرد برنامه پنهان میشود و فقط میتوان به اطلاعات درخواستی و اساسی دسترسی داشت. به بیان دیگر، چنانچه چندین شئ از یک کلاس ایجاد شده باشد، میتوان با استفاده از اصل انتزاع این امکان را فراهم کرد که هر شئ تنها با استفاده از «رابط» (Interface)، به عناصر اصلی اشیاء دیگر دسترسی داشته باشد و نتواند جزئیات «خصوصیتها» (Properties) و متدهای سایر اشیاء را تغییر دهد.
مثالی از دنیای واقعی برای درک بهتر مفهوم انتزاع در شی گرایی
میتوان مفهوم انتزاع را با ارائه یک مثال از دنیای واقعی، ملموستر کرد. میزبانی قصد دارد برای تدارک یک دورهمی دوستانه، از مهمانان خود با شیرینی خانگی پذیرائی کند. میزبان برای پخت شیرینی خانگی، شکر کافی ندارد و میخواهد دو بسته شکر سفارش بدهد. فروشنده فقط به اطلاعات مربوط به تعداد بستههای مورد نیاز خریدار و آدرس منزل او احتیاج دارد تا سفارش خریدار را ارسال کند.
فروشنده لازم نیست بداند چرا میزبان دو بسته شکر سفارش میدهد و از شکر برای چه کاری استفاده خواهد کرد؛ به عبارتی دیگر، جهت خرید یک محصول، فقط اطلاعات مورد نیاز خریدار در اختیار فروشنده قرار میگیرد. به این ترتیب، به مفهوم پنهانسازی جزئیات و اطلاعات غیرمرتبط و حفظ اطلاعات حساس از دیگران در طی یک روند، انتزاع گفته میشود. در ادامه، به مزیت اصل انتزاع و نحوه استفاده از ویژگی Abstract در برنامه نویسی شئگرا به طور جامع پرداخته شده است.
مزیت های اصل Abstract
برنامه نویسی شی گرا، به عنوان یکی از رویکردهای اصلی توسعه نرمافزار تلقی میشود که هر یک از اصول آن در راستای بهبود کیفیت برنامه نویسی، مزیتهای متفاوتی دارند. مزیتهای اصل Abstract به شرح زیرند:
- در برنامه نویسی شئگرا، ویژگی انتزاع به برنامه نویس این امکان را میدهد تا پیچیدگی فرآیند طراحی و پیادهسازی نرمافزار را کاهش دهد.
- با استفاده از ویژگی Abstract نیازی به نوشتن کدهای تکراری نیست و از یک کد میتوان چندین بار در سراسر برنامه استفاده کرد.
- از آنجا که ویژگی انتزاع در شئگرایی مانع دسترسی به جزئیات مهم برنامه میشود، میزان امنیت در برنامه نویسی افزایش مییابد.
- با استفاده از ویژگی انتزاع میتوان چندین کلاس مرتبط به یکدیگر را گروهبندی کرد و خوانایی کد را افزایش داد.
معرفی فیلم های آموزش پایتون
افراد علاقمند به یادگیری برنامه نویسی پایتون میتوانند از مجموعه فیلمهای جامع آموزشی پایتون سایت تم آف استفاده کنند. سایت تم آف پلتفرمی را برای آن دسته از افرادی فراهم کرده است که قصد یادگیری پایتون را دارند. دورههای گردآوری شده در مجموعه آموزش پایتون، فیلمهای آموزشی مقدماتی تا پیشرفته و پروژهمحور زبان پایتون را شامل میشوند. افراد میتوانند از دورههای جامع پایتون در راستای تقویت مهارت برنامه نویسی خود استفاده کنند و از آموزشهای پروژهمحور تم آف بهره بگیرند. در تصویر فوق تنها برخی از دورههای آموزشی مجموعه آموزش پایتون تم آف مشاهده میشوند.
- برای دسترسی به همه آموزش های پایتون تم آف + اینجا کلیک کنید.
نحوه استفاده کاربردی از اصل انتزاع در برنامه نویسی شی گرا
در برنامه نویسی شئگرا، «کلاس انتزاعی» (Abstract Class) و «متد انتزاعی» (Unimplemented Method | Abstract Method) امکاناتی هستند که برای پیادهسازی و استفاده از اصل انتزاع به کار گرفته میشوند.
کلاس انتزاعی در برنامه نویسی شی گرا چیست ؟
در برنامه نویسی شئگرا دو نوع کلاس وجود دارد:
- «کلاس عینی» (Concrete Class): در کلاس عینی یا «کلاس عادی» (Normal Class)، میتوان متدها و خاصیتهای عادی را «تعریف» (Define) کرد و با استفاده از «نمونهسازی» (Instantiation) به اجزای کلاس دسترسی داشت.
- «کلاس انتزاعی» (Abstract Class): کلاس انتزاعی، کلاسی محدود شده است که نمیتوان با استفاده از شئ، «نمونهای» (Instance) را از آن تعریف کرد. برای استفاده از این نوع کلاس، باید از کلاس فرزند استفاده شود تا از کلاس Abstract ارثبری کند.
متد انتزاعی در برنامه نویسی شی گرا چیست ؟
متد انتزاعی، تابعی است که در کلاس انتزاعی استفاده میشود. تنها تفاوت این نوع متد با «متد عادی» (Concrete Method | Implemented Method) در این است که متدهای انتزاعی در کلاس انتزاعی فقط «اعلان» (Declare) میشوند. اعلان کردن متد یا تابع در برنامه نویسی به معنای معرفی اولیهای از عنوان متد یا تابع است، بدون آن که بدنهای برای آنها تعریف شود.
به منظور تعریف بدنه متدهای انتزاعی، باید کلاسهای فرزندی را از کلاس Abstract ایجاد کرد. با استفاده از نمونهسازی یک شئ از کلاس فرزند میتوان به متدهای انتزاعی نیز دسترسی داشت. لازم به ذکر است که کلاسهای Abstract، حداقل شامل یک متد Abstract هستند و میتوان درون این کلاسها از متدهای عادی نیز استفاده کرد.
کلاس Abstract در پایتون
به منظور رعایت اصول شئگرایی در Python و استفاده از ویژگی Abstraction در این زبان، نمیتوان به صورت مستقیم متدهای Abstract را اعلان کرد. برای استفاده از این نوع متدها، از ماژول abc
استفاده میشود.
تعریف کلاس Abstract در پایتون
برای تعریف یک کلاس Abstract در پایتون ، ابتدا باید ماژول abc
را به صورت زیر فراخوانی کرد:
from abc import ABC
class AbstractClassName
(ABC):
pass
کلمه کلیدی pass
در مثال بالا به این معنی است که در کلاسAbstractClassName
، کدی وجود ندارد.
کاربرد عبارت pass در پایتون چیست؟
اگر از عبارت pass
در مثال بالا استفاده نشود، کامپایلر خطا میدهد. به بیان دقیقتر، هنگام تعریف موجودیتهایی شامل کلاسها، متدها، حلقهها و دستورهای شرطی if
در پایتون باید کدهای درونی آنها نیز نوشته شوند؛ در غیر این صورت، باید از کلمه کلیدی pass
به جای نوشتن دستورات درونی آنها استفاده کرد تا خطای کامپایلر ایجاد نشود.
تعریف متد انتزاعی برای کلاس Abstract در پایتون
پیش از هرچیز، برای تعریف متد انتزاعی پایتون باید از دکوراتور @abstractmethod
به صورت زیر استفاده کرد:
from abc import ABC, abstractmethod
class AbstractClassName(ABC):
@abstractmethod
def abstractMethod(self):
pass
در اینجا باید به این نکته اشاره کرد که برخلاف زبان جاوا، در پایتون میتوان برای متدهای انتزاعی بدنه تعریف کرد و با استفاده از «متد بازنویسی» (Overriding Method) و به کاربردن متد super()
به بدنه متد انتزاعی واقع در کلاس انتزاعی دسترسی داشت.
import abc
class AbstractClass(ABC):
def __init__(self, value):
self.value = value
super().__init__()
@abc.abstractmethod
def some_action(self):
print("This is the parent implementation.")
class MySubclass(AbstractClass):
def some_action(self):
super().some_action()
print("This is the subclass implementation. ")
x = MySubclass()
x.some_action()
همچنین، مطابق مثال بالا میتوان یک تابع «سازنده» (Constructor) در کلاس Abstract در پایتون تعریف کرد. به علاوه، در این مثال میتوان از عبارت @abc.abstractmethod
به عنوان دکوراتور متد انتزاعی نیز استفاده کرد.
هنگام استفاده از اصل انتزاع باید به این نکته توجه داشت که اگر کلاس فرزند مربوط به کلاس انتزاعی بدنهای برای متد انتزاعی نداشته باشد، کلاس فرزند نیز یک کلاس انتزاعی تلقی میشود و نمیتوان برای این کلاس فرزند شئای تعریف کرد. در صورت تعریف شئ از کلاس فرزند، خطای کامپایلر رخ میدهد.
from abc import ABC, abstractmethod
#Abstract Class
class Bank(ABC):
def bank_info(self):
print("Welcome to bank")
@abstractmethod
def interest(self):
"Abstarct Method"
pass
#Sub class/ child class of abstract class
class SBI(Bank):
def balance(self):
print("Balance is 100")
s= SBI()
s.bank_info ()
s.balance()
در مثال بالا، Bank
یک کلاس Abstract است که شامل یک متد انتزاعی با نام interest()
است. کلاس SBI
نیز کلاس فرزند مربوط به کلاس والد Bank
است. در کلاس SBI
بدنه متد انتزاعی interest()
تعریف نشده است. بدین ترتیب، کلاس SBI
نیز یک کلاس انتزاعی محسوب میشود و نمیتوان از این کلاس نمونهسازی کرد.
جمعبندی
در مقاله حاضر با عنوان «کلاس Abstract در پایتون — به زبان ساده» به توضیح مفهوم انتزاع در برنامه نویسی شئگرا پرداخته شد. این اصل از شئگرایی در قالب دو مفهوم کلاس Abstract و متد Abstract در زبان برنامه نویسی پایتون به کار میرود که به مثالهای کاربردی درباره نحوه استفاده از آنها در مطلب فعلی اشاره شد.