Что такое абстракция в программировании?
В программировании абстракция означает сокрытие подробностей того, как что-то работает, за более простым интерфейсом, чтобы этим можно было пользоваться, зная только, что оно делает. Вызов sorted(names) сортирует список, и тебе не нужно писать или даже видеть алгоритм сортировки.
Обновлено 24 сентября 2026 г.
Когда ты пишешь print("hi"), ты не думаешь о том, как эти буквы попадают на экран. Под этой одной строкой Python превращает текст в байты и просит операционную систему записать их, операционная система передаёт их терминалу, а терминал рисует каждую букву пикселями с помощью шрифта. Каждый слой даёт слою над ним простое обещание и скрывает, как его выполняет. Это сокрытие и есть абстракция, и любая программа стоит на множестве таких слоёв.
Уровни абстракции
| Уровень | С чем ты работаешь | Что скрыто |
|---|---|---|
| Твоя программа | print("hi"), sorted(names) | Как библиотека выполняет работу |
| Python и его стандартная библиотека | Строки, списки, файлы | Управление памятью, системные вызовы |
| Интерпретатор (CPython) | Байт-код | Код на C и машинный код, которые его выполняют |
| Операционная система | Файлы, процессы | Блоки диска, драйверы устройств, планирование процессора |
| Аппаратура | Машинные инструкции | Транзисторы и электрические сигналы |
Каждый уровень построен из нижнего, и его можно понять без него. Можно писать работающий код на Python, не зная, что такое блок диска, а операционная система может сохранить файл, не зная, что в нём код на Python.
Как абстракция работает в коде
Программисты строят свои слои двумя основными способами.
Процедурная абстракция это функция. Её имя, параметры и возвращаемое значение составляют интерфейс; тело это скрытая деталь. Как только появилась average(scores), остальная программа пользуется ею, не читая, как она складывает и делит.
Абстракция данных определяет тип через то, что с ним можно делать, а не через то, как он хранит данные. Очередь это «добавить в конец, взять из начала». Как элементы лежат в памяти, решается внутри:
serving soup
serving pasta
serving cake
Код внизу ничего не знает о deque. Если заменить её обычным списком и pop(0), вывод будет тем же, только для длинных очередей медленнее, потому что удаление первого элемента списка сдвигает все остальные элементы. Интерфейс остался прежним, поэтому ничего вне класса менять не пришлось.
Абстрактные классы и интерфейсы
В объектно-ориентированном программировании абстракция обычно означает, что указывается, что должно делать семейство классов, а как, оставляется каждому классу. В Python модуль abc помечает метод как абстрактный; класс с нереализованным абстрактным методом нельзя создать:
email to ana@example.com: Your package arrives today
sms to +15550100: Your package arrives today
Notifier is abstract: create an Email or an SMS instead
remind() зависит только от абстракции: от чего угодно с методом send. Чтобы добавить push-уведомления, нужно написать один новый класс, а remind() остаётся нетронутой. Этот последний шаг, когда один вызов выполняет разный код для разных классов, называется полиморфизмом: абстракция задаёт общий интерфейс, а полиморфизм заставляет его работать.
В Java те же инструменты выражены ключевыми словами:
interface Notifier {
void send(String to, String text);
}
class Email implements Notifier {
public void send(String to, String text) { /* talk to the mail server */ }
}
Запись new Notifier() это ошибка компиляции, потому что у интерфейса нет реализации, которую можно выполнить. В документации подробно описаны абстрактные классы и интерфейсы в Java.
Абстракция и инкапсуляция: в чём разница
Эти две идеи так часто встречаются вместе, что их легко перепутать.
| Абстракция | Инкапсуляция | |
|---|---|---|
| На какой вопрос отвечает | Что это делает? | Кто может трогать данные? |
| На чём сосредоточена | Интерфейс: предлагаемые операции | Внутреннее устройство: данные за интерфейсом |
| Основные инструменты | Функции, абстрактные классы, интерфейсы, модули | private, _name, свойства, #fields |
| Пример | Notifier.send() работает для почты и SMS | _balance меняется только через withdraw() |
| Уровень | Проектирование | Реализация |
Абстракция решает, какие операции показать; инкапсуляция следит, чтобы остальное оставалось скрытым. Queue выше делает и то и другое: add и next это абстракция, а подчёркивание в _items это инкапсуляция.
Протекающие абстракции и другие ошибки
Джоэл Спольски в 2002 году сформулировал закон протекающих абстракций: любая нетривиальная абстракция пропускает часть скрытых деталей наружу. Классический пример утечки это числа с плавающей точкой. Они выглядят как обычные десятичные дроби, пока сквозь них не проступит двоичное хранение:
0.30000000000000004
False
Ни 0,1, ни 0,2 нельзя точно сохранить в двоичных битах, поэтому сумма получается чуть неточной. Можно годами пользоваться числами с плавающей точкой и не думать об этом, но не вечно, и поэтому полезно знать один слой ниже того, в котором ты работаешь.
Ещё две ошибки встречаются часто:
- Слишком ранняя абстракция. Иерархия классов, построенная под случаи, которые так и не наступили, это лишний код, который нужно читать и менять. Сэнди Метц сформулировала это так: «дублирование обходится гораздо дешевле, чем неправильная абстракция».
- Смешение абстракции с ключевым словом
abstract. Абстрактные классы это лишь один инструмент. Любая функция с хорошим именем тоже абстракция.
Что читать дальше
Прочитай про инкапсуляцию и полиморфизм, чтобы завершить картину объектно-ориентированного программирования. Страница про операционную систему показывает самую большую абстракцию, на которую опираются твои программы. Для практики курс Python с самого начала учит строить классы и функции, а курс Java разбирает абстрактные классы и интерфейсы.
Часто задаваемые вопросы
Какой пример абстракции можно привести?
len(items), зная, что она возвращает, но не зная, как Python считает. Педали автомобиля это бытовой вариант: ты управляешь скоростью, не зная, как двигатель сжигает топливо. В объектно-ориентированном коде интерфейс вроде Notifier с одним методом send это абстракция над электронной почтой, SMS и push-уведомлениями.Что такое абстракция в Python?
abc позволяет объявить абстрактный базовый класс с @abstractmethod; тогда Python отказывается создавать объекты этого класса, а также любого подкласса, в котором реализованы не все абстрактные методы.Что такое абстракция в Java?
new. Интерфейс перечисляет методы, которые должен предоставить любой реализующий его класс, и класс может реализовывать несколько интерфейсов.