کلاس Abstract در پایتون — به زبان ساده
علاقمندان به یادگیری برنامه نویسی به خصوص برنامه نویسی با زبان پایتون، حتما با مفهومی به نام شئگرایی برخورد کردهاند. شئگرایی یکی از بنیادهای مهم توسعه نرمافزارهای مدرن به حساب میآید و پایتون نیز این امکان را برای کاربران خود فراهم کرده است. شئگرایی چهار اصل مهم را شامل میشود که یکی از این اصول، «انتزاع» (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را به صورت زیر فراخوانی کرد:
1from abc import ABC
2class <span class="fdb-output fdb-output-inline">AbstractClassName</span> (ABC):
3 pass
کلمه کلیدیpass در مثال بالا به این معنی است که در کلاسAbstractClassName
، کدی وجود ندارد.
کاربرد عبارت pass در پایتون چیست؟
اگر از عبارتpass در مثال بالا استفاده نشود، کامپایلر خطا میدهد. به بیان دقیقتر، هنگام تعریف موجودیتهایی شامل کلاسها، متدها، حلقهها و دستورهای شرطیif در پایتون باید کدهای درونی آنها نیز نوشته شوند؛ در غیر این صورت، باید از کلمه کلیدیpass به جای نوشتن دستورات درونی آنها استفاده کرد تا خطای کامپایلر ایجاد نشود.
تعریف متد انتزاعی برای کلاس Abstract در پایتون
پیش از هرچیز، برای تعریف متد انتزاعی پایتون باید از دکوراتور@abstractmethod به صورت زیر استفاده کرد:
1from abc import ABC, abstractmethod
2class AbstractClassName(ABC):
3 @abstractmethod
4 def abstractMethod(self):
5 pass
در اینجا باید به این نکته اشاره کرد که برخلاف زبان جاوا، در پایتون میتوان برای متدهای انتزاعی بدنه تعریف کرد و با استفاده از «متد بازنویسی» (Overriding Method) و به کاربردن متدsuper() به بدنه متد انتزاعی واقع در کلاس انتزاعی دسترسی داشت.
1import abc
2class AbstractClass(ABC):
3 def __init__(self, value):
4 self.value = value
5 super().__init__()
6 @abc.abstractmethod
7 def some_action(self):
8 print("This is the parent implementation.")
9class MySubclass(AbstractClass):
10 def some_action(self):
11 super().some_action()
12 print("This is the subclass implementation. ")
13x = MySubclass()
14x.some_action()
همچنین، مطابق مثال بالا میتوان یک تابع «سازنده» (Constructor) در کلاس Abstract در پایتون تعریف کرد. به علاوه، در این مثال میتوان از عبارت@abc.abstractmethod به عنوان دکوراتور متد انتزاعی نیز استفاده کرد.
هنگام استفاده از اصل انتزاع باید به این نکته توجه داشت که اگر کلاس فرزند مربوط به کلاس انتزاعی بدنهای برای متد انتزاعی نداشته باشد، کلاس فرزند نیز یک کلاس انتزاعی تلقی میشود و نمیتوان برای این کلاس فرزند شئای تعریف کرد. در صورت تعریف شئ از کلاس فرزند، خطای کامپایلر رخ میدهد.
1from abc import ABC, abstractmethod
2#Abstract Class
3class Bank(ABC):
4 def bank_info(self):
5 print("Welcome to bank")
6 @abstractmethod
7 def interest(self):
8 "Abstarct Method"
9 pass
10#Sub class/ child class of abstract class
11class SBI(Bank):
12 def balance(self):
13 print("Balance is 100")
14s= SBI()
15s.bank_info ()
16s.balance()
در مثال بالا،Bank یک کلاس Abstract است که شامل یک متد انتزاعی با نامinterest() است. کلاسSBI نیز کلاس فرزند مربوط به کلاس والدBank است. در کلاسSBIبدنه متد انتزاعیinterest()تعریف نشده است. بدین ترتیب، کلاسSBIنیز یک کلاس انتزاعی محسوب میشود و نمیتوان از این کلاس نمونهسازی کرد.
جمعبندی
در مقاله حاضر با عنوان «کلاس Abstract در پایتون — به زبان ساده» به توضیح مفهوم انتزاع در برنامه نویسی شئگرا پرداخته شد. این اصل از شئگرایی در قالب دو مفهوم کلاس Abstract و متد Abstract در زبان برنامه نویسی پایتون به کار میرود که به مثالهای کاربردی درباره نحوه استفاده از آنها در مطلب فعلی اشاره شد.
سلام.لطفا یک مثال کاربردی واقعی بزنید.من این قطعه کد رو بدون ABC نوشتم و داره مثل مفهوم انتزاعی عمل میکنه.یعنی میشه از متد های هم نام در کلاس های فرزند استفاده کرد…میشه یه مثال عملی بزنید بفهمم واقعا کجا کاربرد داره؟
class Abbas():
def show(self):
pass
class A(Abbas):
def show(self):
print(‘my name is a’)
class B(Abbas):
def show(self):
print(‘my name is b’)
class C(Abbas):
def show(self):
print(‘my name is c’)
s = A()
d = B()
g = C()
s.show()
d.show()
g.show()
ساده و روان. در کل عالی بود.