0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: python, java, protected, public, private, from m import *, _cachedresponse__intermediate_result, name mangling, ооп</p>
1
<p>Теги: python, java, protected, public, private, from m import *, _cachedresponse__intermediate_result, name mangling, ооп</p>
2
<p>Никаких вам фабрик абстрактных классов, интерфейсов и вот этого всего. Есть, конечно, ABC и очумелые ручки, но это совсем другая история. Конечно, есть классы и наследование. Несмотря на это, в Python нет строгого разделения на<strong>public/private/protected</strong>.</p>
2
<p>Никаких вам фабрик абстрактных классов, интерфейсов и вот этого всего. Есть, конечно, ABC и очумелые ручки, но это совсем другая история. Конечно, есть классы и наследование. Несмотря на это, в Python нет строгого разделения на<strong>public/private/protected</strong>.</p>
3
<p>На фоне этой правды жизни возникло соглашение о том, что одно нижнее подчеркивание<strong>(_)</strong>перед именем означает пометку "только для внутреннего пользования" и даже в случае<strong>from M import</strong>* такие имена не будут импортироваться.</p>
3
<p>На фоне этой правды жизни возникло соглашение о том, что одно нижнее подчеркивание<strong>(_)</strong>перед именем означает пометку "только для внутреннего пользования" и даже в случае<strong>from M import</strong>* такие имена не будут импортироваться.</p>
4
<p>Но это всё же лишь соглашение. И если очень хочется, то ничто особо не мешает получить, например, доступ к полю, начинающемуся с нижнего подчеркивания. Самое близкое, в некотором смысле, к<strong>private</strong>-полю в Python можно получить, написав не одно, а два нижних подчеркивания перед именем.</p>
4
<p>Но это всё же лишь соглашение. И если очень хочется, то ничто особо не мешает получить, например, доступ к полю, начинающемуся с нижнего подчеркивания. Самое близкое, в некотором смысле, к<strong>private</strong>-полю в Python можно получить, написав не одно, а два нижних подчеркивания перед именем.</p>
5
<p>При попытке прямого доступа в таком случае получается ошибка, например:</p>
5
<p>При попытке прямого доступа в таком случае получается ошибка, например:</p>
6
Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: CachedResponse instance has no attribute ‘__intermediate_result’<p>Но даже такой механизм обеспечения приватности не особо сильнее предыдущего, так как на самом деле, значение поля из примера выше можно получить, обратившись к атрибуту<strong>_CachedResponse__intermediate_result</strong>.</p>
6
Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: CachedResponse instance has no attribute ‘__intermediate_result’<p>Но даже такой механизм обеспечения приватности не особо сильнее предыдущего, так как на самом деле, значение поля из примера выше можно получить, обратившись к атрибуту<strong>_CachedResponse__intermediate_result</strong>.</p>
7
<p>Это так называемый<strong>name mangling</strong>. Но, в основном, он всё же нужен для того, чтобы избегать инцидентов с одинаковыми именами полей в дочерних классах и т.п.</p>
7
<p>Это так называемый<strong>name mangling</strong>. Но, в основном, он всё же нужен для того, чтобы избегать инцидентов с одинаковыми именами полей в дочерних классах и т.п.</p>
8
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
8
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
9
9