👋 Канал OTUS в Telegram!
Посты от приглашенных гостей из IT-тусовки, полезные статьи, подборки вакансий от партнеров ➞
Подробнее

Курсы

Программирование
Архитектор программного обеспечения
-40%
Архитектура и шаблоны проектирования
-40%
Разработчик Java
-40%
Архитектор высоких нагрузок
-40%
Разработчик Node.js
-40%
Backend-разработчик на PHP
-30%
Symfony Framework
-30%
Разработчик на Spring Framework
-20%
Разработчик Golang
-25%
C# ASP.NET Core разработчик
-25%
iOS-разработчик. Базовый курс
-25%
Android-разработчик. Базовый курс VOIP инженер Базы данных Fullstack разработчик JavaScript Android-разработчик. Продвинутый курс Разработчик программных роботов (RPA) на базе UiPath и PIX Разработчик игр на Unity Vue.js разработчик Agile Project Manager в IT Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

ООП в Python – это вам не Java

Python_Deep_6.08_Site.png

Никаких вам фабрик абстрактных классов, интерфейсов и вот этого всего. Есть, конечно, ABC и очумелые ручки, но это совсем другая история. Конечно, есть классы и наследование. Несмотря на это, в Python нет строгого разделения на public/private/protected.

На фоне этой правды жизни возникло соглашение о том, что одно нижнее подчеркивание (_) перед именем означает пометку «только для внутреннего пользования» и даже в случае from M import * такие имена не будут импортироваться.

Но это всё же лишь соглашение. И если очень хочется, то ничто особо не мешает получить, например, доступ к полю, начинающемуся с нижнего подчеркивания. Самое близкое, в некотором смысле, к private-полю в Python можно получить, написав не одно, а два нижних подчеркивания перед именем.

При попытке прямого доступа в таком случае получается ошибка, например:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: CachedResponse instance has no attribute __intermediate_result

Но даже такой механизм обеспечения приватности не особо сильнее предыдущего, так как на самом деле, значение поля из примера выше можно получить, обратившись к атрибуту _CachedResponse__intermediate_result.

Это так называемый name mangling. Но, в основном, он всё же нужен для того, чтобы избегать инцидентов с одинаковыми именами полей в дочерних классах и т.п.

Есть вопрос? Напишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться