/
obuxxxov
/
CodeForge
Обзор
Документация
Войти
/
obuxxxov
/
CodeForge
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
comb
visual/logotips/article_preview.html
205 строк
12 KB
ObliInSe
start
18 авг 2025, 00:31
18 авг 2025, 00:31
0671f4e
Код
Авторство
О чём код?
<!doctype html> <html lang="ru"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>Превью статьи (.md)</title> <style> :root{ --bg:#0b1220; --ink:#f5f5f5; --muted:#a7b3c5; --accent:#4c6ef5; --code-bg:#1e1e1e; } *{box-sizing:border-box} html,body{height:100%} body{ margin:0; padding:0; background: var(--bg); color: var(--ink); font: 16px/1.7 Inter, system-ui, -apple-system, Segoe UI, Roboto, Ubuntu, Cantarell, Noto Sans, Arial, "Apple Color Emoji","Segoe UI Emoji"; } .main{ min-height:100%; display:flex; justify-content:center; } .article-container{ width:100%; max-width:900px; padding:40px 24px 80px; text-align:left; } .article-container h1,h2,h3,h4,h5,h6{ color:#fff; margin: 28px 0 10px; line-height:1.25; } .article-container h2, .article-container h3{ border-bottom:2px solid var(--accent); padding-bottom:6px; } .article-container p{margin:12px 0} .article-container ul, .article-container ol{padding-left:22px} .article-container a{color:#7ab8ff; text-underline-offset:3px} .article-container a:hover{text-decoration:underline} .article-container code{ background: rgba(255,255,255,0.06); padding: 2px 6px; border-radius:6px; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono","Courier New", monospace; font-size: 0.95em; } .article-container pre{ background: var(--code-bg); color: var(--ink); padding:16px; border-radius:10px; overflow:auto; box-shadow: 0 0 0 1px rgba(255,255,255,0.06) inset; } .article-container pre code{ background: transparent; padding: 0; border-radius:0; display:block; white-space: pre; } blockquote{ margin: 16px 0; padding: 10px 16px; border-left: 4px solid var(--accent); background: rgba(255,255,255,0.04); border-radius: 0 10px 10px 0; } hr{ border: none; border-top: 1px solid rgba(255,255,255,0.12); margin: 24px 0; } .smallnote{ opacity:.6; font-size:12px; margin-top:28px; } </style> </head> <body> <main class="main"> <article class="article-container"> <h1>Инкапсуляция и управление состоянием объектов в Python</h1> <h2>Введение</h2> <p>Инкапсуляция — механизм сокрытия внутренней реализации объекта от внешнего мира, позволяющий контролировать доступ к его данным и поведению.</p> <h2>Основные концепции</h2> <h3>Приватные атрибуты и методы</h3> <p>Python предоставляет возможность объявления приватных элементов через одно или два подчеркивания:</p> <div class="codehilite"> <pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Example</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">_protected_attr</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Защищённый атрибут</span> <span class="bp">self</span><span class="o">.</span><span class="n">__private_attr</span> <span class="o">=</span> <span class="kc">None</span> <span class="c1"># Приватный атрибут</span> </code></pre> </div> <h3>Переменная <code>self</code></h3> <p><code>self</code> — специальный параметр, передаваемый первым аргументом во все методы экземпляров класса, обеспечивающий доступ к атрибутам и методам текущего объекта:</p> <div class="codehilite"> <pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Person</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span> <span class="k">def</span><span class="w"> </span><span class="nf">greet</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Привет, я </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="si">}</span><span class="s1">'</span><span class="p">)</span> </code></pre> </div> <h2>Примеры использования приватных методов</h2> <div class="codehilite"> <pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Account</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">balance</span><span class="o">=</span><span class="mi">0</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">=</span> <span class="n">balance</span> <span class="k">def</span><span class="w"> </span><span class="nf">_validate_amount</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span> <span class="c1"># Приватный вспомогательный метод</span> <span class="k">return</span> <span class="n">amount</span> <span class="o">></span> <span class="mi">0</span> <span class="k">def</span><span class="w"> </span><span class="nf">deposit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span> <span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_validate_amount</span><span class="p">(</span><span class="n">amount</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> <span class="o">+=</span> <span class="n">amount</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_balance</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__balance</span> </code></pre> </div> <h2>Практическое применение</h2> <p>Расширим предыдущий пример:</p> <div class="codehilite"> <pre><span></span><code><span class="k">class</span><span class="w"> </span><span class="nc">Rectangle</span><span class="p">:</span> <span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">height</span><span class="p">):</span> <span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">=</span> <span class="n">width</span> <span class="bp">self</span><span class="o">.</span><span class="n">__height</span> <span class="o">=</span> <span class="n">height</span> <span class="k">def</span><span class="w"> </span><span class="nf">area</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">__height</span> <span class="k">def</span><span class="w"> </span><span class="nf">perimeter</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="k">return</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__width</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">__height</span><span class="p">)</span> </code></pre> </div> <h2>Проверка типов</h2> <p>Типизация помогает повысить надежность и читаемость кода:</p> <div class="codehilite"> <pre><span></span><code><span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Union</span> <span class="k">def</span><span class="w"> </span><span class="nf">sum_numbers</span><span class="p">(</span><span class="n">a</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">],</span> <span class="n">b</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">])</span> <span class="o">-></span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">]:</span> <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> </code></pre> </div> <h2>Рекомендации по использованию</h2> <ul> <li>Применяйте приватные атрибуты и методы для ограничения доступа.</li> <li>Используйте аннотации типов для явного указания контрактов функций.</li> <li>Разграничивайте публичные и приватные элементы с помощью одного/двух символов подчеркивания.</li> </ul> <h2>Чек-лист</h2> <ul> <li>Объявляйте приватные атрибуты и методы.</li> <li>Корректно используйте <code>self</code>.</li> <li>Аннотируйте типы параметров и результатов.</li> <li>Применяйте структуры данных (<code>dataclass</code>, <code>TypedDict</code>) там, где это уместно.</li> </ul> <h2>Дополнительная практика</h2> <p>Реализуйте класс <code>Circle</code>, содержащий приватные атрибуты радиуса и методы для расчета длины окружности и площади круга. </p> <h2>Источники</h2> <ul> <li><a href="https://sky.pro/wiki/python/oop-v-python-inkapsulyaciya/">Инкапсуляция в Python</a></li> <li><a href="https://pythonworld.ru/osnovy/inkapsulyaciya-nasledovanie-polimorfizm.html">Основы ООП в Python</a></li> <li><a href="https://pythonist.ru/self-v-python-s-primerami/">Использование переменной self в Python</a></li> </ul> <p class="smallnote">Рендер: markdown2. Текст выровнен по левому краю, светлый на тёмной подложке. Максимальная ширина — 900px.</p> </article> </main> </body> </html>