Публичные, защищённые и приватные атрибуты
less_38___encapsulation_2/theory_01__public_protected_and_private_attrs.md
Раскрывает второй, более строгий аспект инкапсуляции — «спрятать, чтобы не брали без спросу», в отличие от первого («убрать с глаз долой», атрибуты как часть объекта). Разбирает три уровня доступа: публичные атрибуты (без подчёркивания, свободный доступ отовсюду), защищённые (`_name`, соглашение «не трогать снаружи», но Python не запрещает) и приватные (`__name`, Python применяет name mangling — переименовывает атрибут в `_ClassName__attribute`, что затрудняет, но не исключает случайный доступ извне).
- Два аспекта инкапсуляции: «убрать с глаз долой» vs «спрятать, чтобы не брали без спросу»
- Публичный атрибут: self.name — доступен отовсюду
- Защищённый атрибут: self._name — соглашение, не строгий запрет
- Приватный атрибут: self.__name — name mangling в _ClassName__attribute
- p._Person__name — обход name mangling, доступ всё же возможен
- Итоговая таблица трёх уровней доступа
Показать начало файла (96 строк всего)
## Публичные, защищённые и приватные аттрибуты
Инкапсуляция означает:
* Скрыть (упаковать, спрятать) что-то внутрь какой-то оболочки (капсулы)
В ООП (вообще и в Python в частности) под инкапсуляцией понимается
* размещение данных и/или логики внутрь объекта,
* чтобы при необходимости легко получить (вызвать) через dot-notation
Сам смысл этого "сокрытия лишнего" можно рассматривать (понимать) в двух аспектах:
1. "Убрать с глаз долой, чтобы не мешалось"
* Атрибуты создаются в `__init__()` и затем не требуют специальной передачи в методы
* поскольку уже и так становятся часть объекта
2. "Спрятать, чтобы не брали без спросу"
* Получение и/или изменение данных возможно ТОЛЬКО при соблюдении определённых условий
Вот именно второй аспект понятия "Инкапсуляция" мы и рассмотрим в этом блоке.
### 1. Публичные атрибуты (`public attributes`)
**Принцип**: *"Приходи кто хочешь, и бери сколько захочешь"*
* Доступны **из любого места**: внутри класса, из подклассов, из внешнего кода.
* Обычно **не имеют специальных подчёркиваний**.
* Используются по умолчанию.
**Пример:**
```python
class Person:
def __init__(self, name):
self.name = name # публичный атрибут
p = Person("Alice")
print(p.name) # доступно извне
```
---
### 2. Защищённые атрибуты (`_protected attributes`)
**Принцип**: *"Приходи кто хочешь, но бери только для внутреннего использования"*
* Обозначаются **одним подчёркиванием `_` перед именем**: `_attribute`.
* **Соглашение**: к ним **не следует обращаться извне класса**, но Python не запрещает это.
* Часто используются для **наследования** и для внутреннего контроля.
**Пример:**
```python
class Person:
def __init__(self, name):
self._name = name # защищённый атрибут
p = Person("Bob")
…