|
1 | | -coming soon... |
| 1 | +## Определение |
| 2 | +!!! info "" |
| 3 | + **Абстракция** (Abstraction) — это принцип ООП, заключающийся в выделении главных характеристик объекта и скрытии второстепенных деталей. Абстракция показывает **что** делает объект, а не **как** он это делает. |
| 4 | + |
| 5 | +## Зачем нужна |
| 6 | +<span class="badge">Абстракция</span> упрощает сложные системы, скрывая детали реализации и оставляя только самое важное. Она позволяет работать с объектом на уровне концепций, не вникая в технические подробности. |
| 7 | + |
| 8 | +Внешний код взаимодействует с объектом через **упрощённый интерфейс**, не задумываясь о внутренней механике. |
| 9 | + |
| 10 | +## Отличия Абстракции и Инкапсуляции |
| 11 | +- <span class="badge">Инкапсуляция</span> - контроль доступа к данным |
| 12 | +- <span class="badge">Абстракция</span> — упрощение интерфейса |
| 13 | +## Уровни абстракции |
| 14 | + |
| 15 | +Абстракция работает на разных уровнях проектирования: |
| 16 | + |
| 17 | +- Абстрактные классы — классы, которые нельзя создать напрямую; они служат шаблоном для наследников. |
| 18 | +- Интерфейсы — набор методов, которые обязан реализовать класс (в Python через протоколы или `ABC`). |
| 19 | +- Высокоуровневые функции — операции, которые скрывают сложную логику за простым вызовом. |
| 20 | + |
| 21 | +## Абстракция в Python |
| 22 | + |
| 23 | +В Python абстракцию реализуют через модуль `abc` (Abstract Base Classes): |
| 24 | + |
| 25 | +| Инструмент | Суть | Применение | |
| 26 | +| :---------------- | :-------------------------------------------------------- | :---------------------------- | |
| 27 | +| `ABC` | Базовый класс для создания абстрактных классов | `class Shape(ABC):` | |
| 28 | +| `@abstractmethod` | Декоратор, помечающий метод как обязательный к реализации | `@abstractmethod def draw():` | |
| 29 | +| Протоколы | Неформальный способ задать интерфейс через duck typing | Просто наличие нужных методов | |
| 30 | + |
| 31 | +Абстрактный класс нельзя создать, пока все его абстрактные методы не будут реализованы в подклассах. |
| 32 | + |
| 33 | +## Пример |
| 34 | +```python |
| 35 | + from abc import ABC, abstractmethod |
| 36 | + |
| 37 | + class Animal(ABC): |
| 38 | + @abstractmethod |
| 39 | + def make_sound(self): |
| 40 | + """Каждое животное должно уметь издавать звук""" |
| 41 | + pass |
| 42 | + |
| 43 | + class Dog(Animal): |
| 44 | + def make_sound(self): |
| 45 | + return "Гав!" |
| 46 | + |
| 47 | + class Cat(Animal): |
| 48 | + def make_sound(self): |
| 49 | + return "Мяу!" |
| 50 | + |
| 51 | + # animal = Animal() # Ошибка! Нельзя создать экземпляр абстрактного класса |
| 52 | + dog = Dog() |
| 53 | + print(dog.make_sound()) # Гав! |
| 54 | +``` |
| 55 | +## Связь с другими принципами |
| 56 | + |
| 57 | +- [Инкапсуляция](./encapsulation.md){:.link-accent} скрывает **данные и реализацию методов**, делая внутренности объекта недоступными. |
| 58 | +- [Абстракция](./abstraction.md){:.link-accent} скрывает **сложность логики**, оставляя только упрощённый интерфейс для работы. |
| 59 | + |
| 60 | +Обе концепции работают на **сокрытие**, но инкапсуляция защищает данные, а абстракция упрощает использование. |
| 61 | + |
| 62 | +## Ключевые мысли |
| 63 | +- Абстракция выделяет суть объекта, отбрасывая ненужные детали реализации [web:1228]. |
| 64 | +- Она позволяет проектировать систему «сверху вниз»: сначала определить интерфейсы, потом реализовать конкретику. |
| 65 | +- В Python абстрактные классы через `ABC` гарантируют, что подклассы реализуют все обязательные методы [web:1228]. |
0 commit comments