Четыре столпа ООП: инкапсуляция, абстракция, наследование, полиморфизм
less_36__Inheritance_and_polymorphism/theory_01__4_pillars_of_the_OOP.md
Даёт по одному самостоятельному примеру на каждый из четырёх принципов: BankAccount с приватным __balance для инкапсуляции, ABC-класс Shape с @abstractmethod area() для абстракции, Vehicle → Car для наследования и Cat/Dog с одинаковым по имени методом sound() для полиморфизма. В отличие от урока 66 (там все четыре принципа разбирались на ОДНОМ примере Shape), здесь под каждый принцип — свой отдельный, более наглядный пример.
- Инкапсуляция: BankAccount с self.__balance и методами deposit/withdraw/get_balance
- Абстракция: Shape(ABC) с @abstractmethod area(), реализации в Circle и Square
- Наследование: Car(Vehicle) наследует drive(), добавляет свой honk()
- Полиморфизм: Cat.sound()/Dog.sound() — один интерфейс, разное поведение
- Итоговая сводка: что означает каждый принцип одной фразой
Показать начало файла (131 строк всего)
## 4 столпа (кита, основы) ООП
### 1. Инкапсуляция (Encapsulation)
**Смысл:**
1. Скрытие внутренней реализации объекта и
2. предоставление доступа к данным через методы.
```python
class BankAccount:
def __init__(self, balance):
self.__balance = balance # приватный атрибут
def deposit(self, amount):
if amount > 0:
self.__balance += amount
def withdraw(self, amount):
if 0 < amount <= self.__balance:
self.__balance -= amount
def get_balance(self):
return self.__balance
account = BankAccount(1000)
account.deposit(500)
print(account.get_balance()) # 1500
# print(account.__balance) # Ошибка! Доступ запрещён
```
> Здесь баланс скрыт, и доступ к нему идёт только через методы класса.
---
### 2. Абстракция (Abstraction)
**Смысл:**
* Отделение сути объекта от деталей реализации.
* Мы работаем с объектом через его интерфейс, не заботясь о его внутренней "кухне".
```python
from abc import ABC, abstractmethod
class Shape(ABC):
@abstractmethod
def area(self):
pass
class Circle(Shape):
def __init__(self, radius):
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
class Square(Shape):
def __init__(self, side):
self.side = side
…