Menu
Coddy logo textTech

Что такое абстракция в программировании?

В программировании абстракция означает сокрытие подробностей того, как что-то работает, за более простым интерфейсом, чтобы этим можно было пользоваться, зная только, что оно делает. Вызов sorted(names) сортирует список, и тебе не нужно писать или даже видеть алгоритм сортировки.

Автор: Kevin Spektor, Сооснователь и CTO

Обновлено 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?
Каждая функция, класс и модуль в Python это абстракция над кодом внутри них. Для формального варианта стандартный модуль abc позволяет объявить абстрактный базовый класс с @abstractmethod; тогда Python отказывается создавать объекты этого класса, а также любого подкласса, в котором реализованы не все абстрактные методы.
Что такое абстракция в Java?
В Java абстракцию выражают абстрактными классами и интерфейсами. Абстрактный класс может содержать абстрактные методы, у которых нет тела и которые должны реализовать подклассы, и его нельзя создать через new. Интерфейс перечисляет методы, которые должен предоставить любой реализующий его класс, и класс может реализовывать несколько интерфейсов.
Какие четыре принципа ООП существуют?
Инкапсуляция, абстракция, наследование и полиморфизм. Инкапсуляция защищает данные объекта, абстракция показывает только то, что объект делает, наследование позволяет классу повторно использовать код другого класса, а полиморфизм позволяет одному фрагменту кода работать со многими типами через общий интерфейс.
Может ли абстракция сделать код хуже?
Да, если она появляется слишком рано или скрывает не то. В коде, построенном под случаи, которые так и не наступили, есть лишние слои, которые приходится читать и менять без всякой пользы. Распространённое правило: подожди, пока не напишешь похожий код два или три раза, чтобы общая форма стала ясна до того, как ты дашь ей имя.
Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ