انتزاع (Abstraction) یکی از اصول مهم در برنامهنویسی و به ویژه در برنامهنویسی شیءگرا است. این مفهوم به برنامهنویسان این امکان را میدهد که جزئیات پیچیده را پنهان کنند و تمرکز خود را بر روی ویژگیهای مهم و کلان برنامه بگذارند. در این مقاله، با مفهوم abstraction در پایتون آشنا میشویم و نحوه استفاده از آن در برنامهنویسی شیءگرا را مورد بررسی قرار میدهیم. همچنین پیشنهاد میکنیم از دیگر آموزش های ما نیز دیدن فرمایید:
- لیست و نحوه کار با آن
- دیکشنری در پایتون
- Tuple در پایتون
- if در پایتون
- حلقه for
- حلقه while
- تابع در پایتون
- تبدیل نوع داده
مفهوم انتزاع
انتزاع به معنای پنهان کردن جزئیات پیچیده و جزئی یک واحد (مانند یک کلاس یا تابع) و نمایش ویژگیها و عملکرد مهم آن است. با استفاده از انتزاع، برنامهنویسان میتوانند به صورت سطح بالا تر و انتزاعی به مسائل نگاه کنند، بدون آن که به جزئیات پیادهسازی وارد شوند. abstraction در پایتون به ترتیب به موارد زیر کمک میکند:
- سادهتر کردن کد: با پنهان کردن جزئیات پیچیده و استفاده از واسطها و تعاریف انتزاعی، کد سادهتر و قابل مدیریتتر میشود.
- مقیاسپذیری: انتزاع به برنامهنویسان این امکان را میدهد که کد را به راحتی گسترش دهند و ویژگیهای جدید را اضافه کنند بدون این که به کد قدیمی و جزئیات پیادهسازی دست بزنند.
- تست و اعتبارسنجی: با پنهان کردن جزئیات پیچیده، تست و اعتبارسنجی برنامه سادهتر و مؤثرتر میشود. برنامهنویسان میتوانند تست را بر روی واحدهای انتزاعی انجام دهند بدون این که به جزئیات پیچیده نیاز داشته باشند.
- تعامل با بقیه برنامه: انتزاع به برنامهنویسان این امکان را میدهد که با بقیه برنامه به صورت سطح بالا و با ویژگیهای کلان تعامل کنند، بدون این که جزئیات پیادهسازی را بدانند.
abstraction در پایتون
پایتون یک زبان برنامهنویسی شیءگرا است که از اصول انتزاع به خوبی پشتیبانی میکند. در پایتون، میتوانید از کلاسها، توابع، متدها و ویژگیها برای ایجاد انتزاع در کد خود استفاده کنید. به تعدادی از موارد استفاده از انتزاع در پایتون میپردازیم:
انتزاع با استفاده از کلاسها
کلاسهای انتزاعی (Abstract Classes) در پایتون به عنوان کلاسهایی تعریف میشوند که تنها به منظور ارائه یک الگوی برنامهنویسی برای کلاسهای دیگر وجود دارند و نمیتوانند نمونهای (instance) مستقیم از خودشان ایجاد کنند. این کلاسها معمولاً دارای یک یا چند تابع انتزاعی (abstract method) هستند که باید توسط کلاسهای فرزند آنها پیادهسازی شوند. تابع انتزاعی یک تابع است که تنها دارای نام و پارامترهای ورودی است و بدنه آن خالی است.
در اینجا یک مثال کلاس انتزاعی به زبان پایتون را ارائه میدهیم و سپس توضیح میدهیم:
from abc import ABC, abstractmethod
class Animal(ABC):
def __init__(self, name):
self.name = name
@abstractmethod
def speak(self):
pass
class Dog(Animal):
def speak(self):
return f"{self.name} واو واو!"
class Cat(Animal):
def speak(self):
return f"{self.name} میاو میاو!"
# سطر زیر به خطای TypeError منجر میشود.
# animal = Animal("Unknown")
dog = Dog("Rex")
cat = Cat("Whiskers")
print(dog.speak()) # خروجی: "Rex واو واو!"
print(cat.speak()) # خروجی: "Whiskers میاو میاو!"
در این مثال:
- ما یک کلاس انتزاعی به نام
Animal
تعریف میکنیم که از کلاس پایه انتزاعیABC
ارثبری میکند. این کلاس دارای یک تابع سازنده (constructor) با پارامترname
است که نام حیوان را تعیین میکند. همچنین، دارای یک تابع انتزاعی به نامspeak()
است که باید توسط کلاسهای فرزند پیادهسازی شود. - ما دو کلاس فرزند،
Dog
وCat
، از کلاسAnimal
ایجاد میکنیم و تابع انتزاعیspeak()
را در هر کدام از این کلاسها پیادهسازی میکنیم. - در خطوط آخر، نمونههایی (instance) از کلاسهای فرزند
Dog
وCat
ایجاد میشوند و تابعspeak()
بر روی آنها فراخوانی میشود تا صداهای مخصوص هر کلاس چاپ شود.
توجه داشته باشید که کلاس انتزاعی Animal
نمیتواند مستقیماً نمونهای از خودش ایجاد کند؛ این کار باعث ایجاد خطای TypeError
میشود. وظیفهی این کلاس،ایجاد الگوی برنامهنویسی برای کلاسهای فرزند است.
توابع و انتزاع
توابع abstract همانطور که در قسمت قبل دیدید هیچگونه بدنهای ندارند و در کلاسهای Abstract از آنها استفاده میشود.
انتزاع و وراثت
برای پیاده سازی کلاسهای abstract حتماً باید ارثبری انجام شود چراکه از کلاسهای abstract نمیتوان نمونهای (instance) ساخت. دقت کنید در مثال قبل از ارثبری به همراه انتزاع استفاده کردیم.
مزایای استفاده از انتزاع
استفاده از انتزاع در برنامهنویسی پایتون دارای مزایای بسیاری است:
- سادگی کد: با انتزاع دخالت در جزئیات کمتر میشود و این خود کد را سادهتر میکند.
- مدیریتپذیری: با پنهان کردن جزئیات پیچیده، کد قابل مدیریتتری خواهیم داشت و تغییرات راحتتر اعمال میشوند.
- مقیاسپذیری: انتزاع به برنامهنویسان این امکان را میدهد که برنامه را به راحتی گسترش دهند و ویژگیهای جدید اضافه کنند.
- تست و اعتبارسنجی: تست و اعتبارسنجی کد سادهتر و مؤثرتر میشود زیرا میتوان تنها به ویژگیها و خروجیهای انتزاعی توجه کرد.
- تعامل و همکاری: انتزاع به برنامهنویسان امکان تعامل با بقیه برنامه به صورت سطح بالا و با ویژگیهای کلان را میدهد