Абстракція – це одна з концепцій об’єктно-орієнтованого програмування (ООП), яка дозволяє створювати масштабований та більш зручний у підтримці код на Python (та інших мовах програмування які підтримують ООП).
Абстракція передбачає відокремлення основних характеристик та поведінки об’єкта, від конкретних деталей його реалізації. Вона забезпечує високорівневий погляд на об’єкт, фокусуючись на тому, що саме він робить, а не тому як він це робить. Такий підхід дає змогу розробникам ефективно працювати зі складними системами, приховуючи зайві технічні деталі та виставляючи назовні лише релевантні функціональні можливості.
У Python абстракція досягається за допомогою абстрактних класів та абстрактних методів. Абстрактний клас визначає загальний інтерфейс і залишає деталі реалізації своїм похідним класам.
Абстрактні класи в Python
Python не підтримує абстрактні класи на рівні мови безпосередньо, але надає відповідні інструменти через вбудований модуль abc (Abstract Base Classes). Цей модуль дозволяє створювати абстрактні класи та визначати абстрактні методи, які мають бути реалізовані у підкласах.
Основна риса абстрактного класу в Python полягає в тому, що створити його екземпляр безпосередньо неможливо, спроба призведе до помилки TypeError. Абстрактні класи призначені виключно для наслідування – вони визначають набір методів, які мають бути реалізовані в підкласах. Абстрактні методи не містять реалізації, вони лише задають інтерфейс, що має бути реалізований у дочірніх класах.
Щоб оголосити клас як абстрактний у Python, необхідно успадкувати його від abc.ABC (Abstract Base Class), та визначити у ньому принаймні один абстрактний метод за допомогою декоратора @abstractmethod. Це дає Python змогу розпізнати клас як абстрактний, і заборонити створення його екземплярів.
Приклад абстрактного класу:
from abc import ABC, abstractmethod
class Logger(ABC):
@abstractmethod
def log(self, message: str) -> None:
pass
class ConsoleLogger(Logger):
def log(self, message: str) -> None:
print(f'[LOG] {message}')
class FileLogger(Logger):
def __init__(self, file_path: str):
self.file_path = file_path
def log(self, message: str) -> None:
with open(self.file_path, 'a') as f:
f.write(f'{message}\n')
def process_data(data: str, logger: Logger):
logger.log(f'Processing started: {data}')
# ... processing logic ...
logger.log(f'Processing finished: {data}')
console_logger = ConsoleLogger()
file_logger = FileLogger('log.txt')
process_data('User data', console_logger)
process_data('Admin data', file_logger)Клас Logger виконує роль шаблону (абстрактного базового класу) для різних типів логерів. Він визначає інтерфейс, який мають реалізовувати всі його підкласи. Зокрема, класи ConsoleLogger та FileLogger успадковують Logger і надають власні реалізації абстрактного методу log().
Завдяки абстракції ми можемо розглядати об’єкти ConsoleLogger та FileLogger як екземпляри абстрактного класу Logger. Це дає змогу писати універсальний код, який працює з будь-яким логером, не залежачи від деталей його реалізації. Наприклад, функція process_data() не має знати, як саме реалізовано логування – вона працює з будь-яким об’єктом, який реалізує інтерфейс визначений у Logger.
Варто зазначити, що класи, які наслідують абстрактний клас, зобов’язані реалізувати всі його абстрактні методи. Якщо хоча б один абстрактний метод не реалізовано, такий підклас також вважається абстрактним, і створити його екземпляр буде неможливо – це призведе до помилки TypeError.
Підсумок
Абстракція в Python сприяє створенню модульного та розширюваного коду, забезпечуючи чітке розділення між інтерфейсом і реалізацією. Вона дає змогу розробникам зосередитись на високорівневій логіці, полегшує повторне використання коду і спрощує його підтримку.
Документація abc – Abstract Base Classes