در برنامهنویسی، abstraction به معنی پنهانسازی جزئیات پیادهسازی یک قابلیت از کاربران است. به طور خاص، abstraction به کار میرود تا کاربران بتوانند با استفاده از یک واسط سطح بالاتر، از قابلیتهای پیچیده و جزئیات پیادهسازی آن استفاده کنند بدون اینکه بخشهای جزئی تحت پوشش تابع یا کلاس مورد نظر را بدانند.
در پایتون، abstraction میتواند به چندین شکل اجرا شود، اما دو روش اصلی آن عبارتاند از:
۱. Abstract Base Classes: این روش به کار میرود که یک واسط سطح بالا را تعریف کنید و تمام کلاسهایی که قرار است از آن ارثبری کنند، باید متدهای آن را پیادهسازی کنند. برای این کار، از ماژول abc در پایتون استفاده میشود. به عنوان مثال، فرض کنید میخواهید یک واسط برای یک کلاس Shape تعریف کنید که دو متد area و perimeter در آن وجود دارد:
python
import abc
class Shape(metaclass=abc.ABCMeta):
@abc.abstractmethod
def area(self):
pass
@abc.abstractmethod
def perimeter(self):
pass
در این کد، با استفاده از abc.ABCMeta، یک کلاس انتزاعی به نام Shape تعریف شده است. این کلاس دو متد انتزاعی به نام area و perimeter را تعریف کرده است که هر کدام از کلاسهای ارثبری کننده باید آن را پیادهسازی کنند.
۲. Decorators: روش دیگر برای پنهانسازی جزئیات پیادهسازی، استفاده از دکوراتورهاست. با استفاده از دکوراتورها میتوانید یک تابع را به یک تابع مشابه تبدیل کنید، اما با پنهانسازی جزئیات پیادهسازی آن. به عنوان مثال، فرض کنید میخواهید یک تابع به نام encrypt بنویسید که یک رشته متنی را رمزگذاری کند. با استفاده از دکوراتور @wraps، میتوانید نام تابع اصلی را حفظ کنید:
python
from functools import wraps
def encrypt(func):
@wraps(func)
def wrapper(*args, **kwargs):
# کد رمزگذاری
return func(*args, **kwargs)
return wrapper
در این کد، با استفاده از دکوراتور @wraps، نام تابع اصلی encrypt حفظ شده است. همچنین، تابع wrapper با گرفتن هر پارامتری که به encrypt داده شده است، اجرا شده و نتیجه به عنوان خروجی برگردانده میشود. با استفاده از این دکوراتور، جزئیات پیادهسازی تابع encrypt پنهان شده و کاربران میتوانند از آن با استفاده از نام encrypt استفاده کنند.