> For the complete documentation index, see [llms.txt](https://kaze.gitbook.io/qa-theory/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/modifikatory-dostupa-v-python.md).

# Модификаторы доступа в python

В Python нет строгих модификаторов доступа, как в Java или C++, но есть соглашения и механизмы, которые помогают обозначать уровень доступа к атрибутам и методам класса.

***

### 1. **Публичные (public) атрибуты и методы**

* По умолчанию все атрибуты и методы в Python — публичные.
* К ним можно обращаться и читать/писать как внутри класса, так и снаружи.

```python
class MyClass:
    def __init__(self):
        self.value = 10  # публичный атрибут

obj = MyClass()
print(obj.value)  # 10
obj.value = 20
```

***

### 2. **Защищённые (protected) — \_single underscore**

* Атрибуты и методы с одним подчёркиванием `_name` считаются *защищёнными*.
* Это соглашение: разработчик показывает, что этот элемент предназначен для внутреннего использования (в классе и наследниках), но технически к нему можно получить доступ извне.

```python
class MyClass:
    def __init__(self):
        self._protected = 42

obj = MyClass()
print(obj._protected)  # Можно, но не рекомендуется обращаться напрямую
```

***

### 3. **Приватные (private) — \_\_double underscore**

* Атрибуты и методы с двумя подчёркиваниями `__name` вызывают *name mangling* — имя атрибута внутри класса меняется, чтобы затруднить доступ извне.
* Это помогает предотвратить случайное переопределение или доступ из вне, но не даёт 100% защиты.

```python
class MyClass:
    def __init__(self):
        self.__private = 99

obj = MyClass()
# print(obj.__private)  # Ошибка: AttributeError

# Но можно обратиться так:
print(obj._MyClass__private)  # 99
```

***

### Итог

| Модификатор | Синтаксис | Уровень доступа             | Комментарий                                          |
| ----------- | --------- | --------------------------- | ---------------------------------------------------- |
| public      | `name`    | Публичный                   | Общедоступный, нет ограничений                       |
| protected   | `_name`   | Защищённый                  | Соглашение: использовать внутри класса и наследников |
| private     | `__name`  | Приватный (с name mangling) | Скрыт от прямого доступа, но не полностью            |
