# Модификаторы доступа в 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) | Скрыт от прямого доступа, но не полностью            |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kaze.gitbook.io/qa-theory/osnovy-programmirovaniya-na-python/modifikatory-dostupa-v-python.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
