<?xml version="1.0" encoding="utf-8" ?><rss version="2.0" xmlns:tt="http://teletype.in/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>aboutpython</title><generator>teletype.in</generator><description><![CDATA[aboutpython]]></description><link>https://teletype.in/@aboutpython?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><atom:link rel="self" type="application/rss+xml" href="https://teletype.in/rss/aboutpython?offset=0"></atom:link><atom:link rel="next" type="application/rss+xml" href="https://teletype.in/rss/aboutpython?offset=10"></atom:link><atom:link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></atom:link><pubDate>Wed, 08 Apr 2026 07:01:19 GMT</pubDate><lastBuildDate>Wed, 08 Apr 2026 07:01:19 GMT</lastBuildDate><item><guid isPermaLink="true">https://teletype.in/@aboutpython/Uv-xrvIw</guid><link>https://teletype.in/@aboutpython/Uv-xrvIw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/Uv-xrvIw?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>datetime - даты и время</title><pubDate>Wed, 05 Feb 2020 12:45:23 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/a8/ca/a8ca8555-f241-4be1-a756-af1a3f02f32e.png"></img>К данному моменту мы изучили основные типы данных представленные в языке Python. Однако есть еще один тип данных, который довольно часто используется - это тип datetime, который представляет собой дату и время. У нас есть тип datetime, который представляет дату и время, как объединенные, есть тип date, который представляет дату, и есть тип time, который представляет время и тип timedelta, который представляет разницу между двумя датами. Давайте в кратце глянем, как представлен их программный интерфейс, и как ими пользоваться:]]></description><content:encoded><![CDATA[
  <p>К данному моменту мы изучили основные типы данных представленные в языке <strong>Python</strong>. Однако есть еще один тип данных, который довольно часто используется - это тип <strong>datetime</strong>, который представляет собой дату и время. У нас есть тип <strong>datetime</strong>, который представляет дату и время, как объединенные, есть тип <strong>date</strong>, который представляет дату, и есть тип <strong>time</strong>, который представляет время и тип <strong>timedelta</strong>, который представляет разницу между двумя датами. Давайте в кратце глянем, как представлен их программный интерфейс, и как ими пользоваться:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/a8/ca/a8ca8555-f241-4be1-a756-af1a3f02f32e.png" width="547" />
  </figure>
  <p>Так же полезная вещь - взять сегодняшнюю дату, чтобы это сделать нужно написать:</p>
  <pre>print(date.today())</pre>
  <p>Тип <strong>datetime </strong>объединяет типы <strong>date </strong>и <strong>time</strong>. То есть в конструктор <strong>datetime </strong>мы можем прописать год, месяц, день и так же время:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/8b/91/8b91904d-612d-477b-b2fb-cd2b86970dea.png" width="307" />
  </figure>
  <p>Чтобы выдернуть из <strong>datetime</strong>, например месяц и час, то мы используем такой код:</p>
  <pre>print(dt.date().month)
print(dt.time().hour)</pre>
  <p>Чтобы вывести текущий <strong>datetime</strong>:</p>
  <pre>now = datetime.now()
print(now)</pre>
  <p></p>
  <p>Посмотрим на <strong>timedelta</strong>, с помощью которой мы можем смотреть разницу между датами:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/88/53/88533ee4-de61-4a65-9cb5-0804bab83e42.png" width="374" />
  </figure>
  <p>В первом сравнении у нас разница 1 день, 1 час и 5 минут. Во втором случае -2 дня, 22 часа и 55 минут.</p>
  <p>Так же мы можем вычислить разницу во времени между, допустим, днем нашего рождения и сегодняшним днем:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/14/cc/14cc9ae0-de49-4573-805b-2018e69531e5.png" width="250" />
  </figure>
  <p>Соответственно, вот вывод о том, что <strong>delta </strong>это класс <strong>datetime.timedelta</strong>, и нам 120 лет.</p>
  <p>Чтобы ознакомиться более подробно с датами и временем советую перейти <a href="https://all-python.ru/osnovy/modul-datetime.html#datetime" target="_blank">сюда</a>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/HJ_nexmG8</guid><link>https://teletype.in/@aboutpython/HJ_nexmG8?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/HJ_nexmG8?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Реализуем Stack</title><pubDate>Sat, 01 Feb 2020 12:36:00 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/14/06/14064f5e-2624-4ee3-9015-13cd81780922.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/14/06/14064f5e-2624-4ee3-9015-13cd81780922.png"></img>Давайте сегодня разберемся, как можно строить итерируемые объекты. Задевали раньше тему Stack и очереди, попробуем сами сделать Stack. Будем использовать в качестве структуры данных обычный list, то есть список.]]></description><content:encoded><![CDATA[
  <p>Давайте сегодня разберемся, как можно строить итерируемые объекты. Задевали раньше тему <strong>Stack </strong>и очереди, попробуем сами сделать <strong>Stack</strong>. Будем использовать в качестве структуры данных обычный <strong>list</strong>, то есть список.</p>
  <p>Поехали:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/14/06/14064f5e-2624-4ee3-9015-13cd81780922.png" width="996" />
  </figure>
  <p>Теперь проверим наш <strong>stack</strong>:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/ee/83/ee8344a1-59d1-4016-b828-083b447e6412.png" width="350" />
  </figure>
  <p>Если вчитаться в комментарии, то станет понятно, что в итоге у нас произошло. А произошло то, что мы создали некий список из 3 чисел, вызвали <strong>pop</strong>, который вернулнам 3 и стер его из списка. Затем мы проверили, какое число у нас последнее с помощью <strong>peek</strong>, оказалось 2 - все верно. Дальше  проверили, сколько в листе осталось объектов - тоже 2. Добавили в конец списка 4,5,6 и прошлись циклом по <strong>stack</strong>, который вывел нам все объекты начиная с конца. И именно с конца <strong>stack </strong>выводит объекты.</p>
  <p>Вот простой пример, как можно реализовывать свои классы, по инстанциям которых внешнйи код может может идти в цикле. Для этого нужно реализовать два метода - <em>__iter__</em> &amp; <em>__next__</em>. Из <em>__iter__</em> возвращаем <strong>self </strong>и в нем устанавливаем, как правило счетчик в нужную нам позицию, в нашем случае мы указываем на последний элемент. А в <em>__next__</em> уже декрементеруем или инкрементируем счетчик, как нам надо, вбрасываем исключение, которое обрабатывается особым образом - оно просто останавливает итерацию, оно не убивает программу. А дальше один ща одним возвращаем элементы подправляя индекс как надо.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/rJBmWwpZL</guid><link>https://teletype.in/@aboutpython/rJBmWwpZL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/rJBmWwpZL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Отладка</title><pubDate>Tue, 28 Jan 2020 07:22:04 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/af/d9/afd94994-012a-40f0-aa06-fc2f7273fa27.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/af/d9/afd94994-012a-40f0-aa06-fc2f7273fa27.png"></img>Программистам не всегда удается написать программу с первого раза таким образом, чтобы в ней не было ошибок. Программисты постоянно борятся с ошибками. Чтобы отловить эти ошибки в больших программах мы используем процесс, который называется отладка. В наших маленьких скриптах для того, чтобы посмотреть на значения переменных мы просто вызывали функцию print, передавали ей значение и смотрели, что они выводят на консоль. И если у нас были бы ошибки, мы бы вызывали функцию print таким же образом, для того чтобы найти где у нас ошибка, какие переменные находятся не в том состоянии в котором нам нужно. И уже исходя из этого, из результатов вывода принимать какие-то решения и исправлять код. Продемонстрирую элементы отладки и отладочный...]]></description><content:encoded><![CDATA[
  <p>Программистам не всегда удается написать программу с первого раза таким образом, чтобы в ней не было ошибок. Программисты постоянно борятся с ошибками. Чтобы отловить эти ошибки в больших программах мы используем процесс, который называется отладка. В наших маленьких скриптах для того, чтобы посмотреть на значения переменных мы просто вызывали функцию print, передавали ей значение и смотрели, что они выводят на консоль. И если у нас были бы ошибки, мы бы вызывали функцию print таким же образом, для того чтобы найти где у нас ошибка, какие переменные находятся не в том состоянии в котором нам нужно. И уже исходя из этого, из результатов вывода принимать какие-то решения и исправлять код. Продемонстрирую элементы отладки и отладочный процесс в Jupyter Notebook.</p>
  <p>Отладочный модуль у нас находится в модуле, который называется pdb.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/af/d9/afd94994-012a-40f0-aa06-fc2f7273fa27.png" width="664" />
  </figure>
  <p>Тут мы дошли до точки остановы, и теперь мы можем опрашивать состояние нашей программы. Если мы введем Х, то получим 1, то есть отладчик может отвечать нам на запросы.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/30/43/30439a3e-0127-461f-ad77-38c5c7aa22be.png" width="649" />
  </figure>
  <p>Основные команды, которые стоит выделить это команда &quot;<strong>c</strong>&quot; (continue), дает возможность выполнить скрипт от одной точки остановы до другой. Команда &quot;<strong>n</strong>&quot; (next) исполнит инструкцию всего лишь одну, но если есть подвызовы, то есть вызов функции какой-нибудь, то с помощью этой команды мы зайдем внутрь этой функции. Команда &quot;<strong>s</strong>&quot; (step) переходит так же на следующую инструкцию, однако эта команда если попадает на вызов функции, то она не попадет внутрь этой функции, функция просто будет исполнена. И команда &quot;<strong>q</strong>&quot; (quit) просто останавливает отладчик.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/9b/cc/9bcc0d16-58aa-4a70-a241-783542cde9d1.png" width="708" />
  </figure>
  <p>Сейчас мы переместились к следующей точке остановы, где определен <strong>z </strong>и к <strong>x</strong> прибавляется 1. А чтобы оставновить дебагер мы вводим <strong>q</strong>.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/fd/df/fddfbecf-8b8a-4d90-a075-6a87241bcae4.png" width="635" />
  </figure>
  <p>На самом деле команд гораздо больше, и про них можно почитать в документации.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/H1lLALHbI</guid><link>https://teletype.in/@aboutpython/H1lLALHbI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/H1lLALHbI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Еще раз о __name__ и __main__</title><pubDate>Wed, 22 Jan 2020 05:31:51 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/9f/8a/9f8a6ee3-9ef0-4790-b3de-3e32d442b859.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/51/bb/51bbe8b9-084d-4b69-bb4f-e37631c4878d.png"></img>Хотелось бы еще раз обратить внимание на использование специальных символов с двумя подчеркиваниями __name__ и __main__.]]></description><content:encoded><![CDATA[
  <p>Хотелось бы еще раз обратить внимание на использование специальных символов с двумя подчеркиваниями <strong>__name__</strong> и <strong>__main__</strong>.</p>
  <p>Давайте напишем два простых скрипта.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/51/bb/51bbe8b9-084d-4b69-bb4f-e37631c4878d.png" width="488" />
  </figure>
  <p>Что вообще с этим скриптом? Если этот скрипт будет выполнен через сам Python, то есть через CMD, то интерпритатор посмотрит на <strong>__name__</strong> и он будет равен <strong>__main__</strong>. И вывод будет <em>&#x27;call a converting func that you want&#x27;</em> вот такой. else ветка будет работать тогда, когда наш скрипт был не выполнен через Python напрямую, а был заимпортирован через ключевое слово <strong>import</strong>.</p>
  <p>Создадим еще один файлик, он будет вызывать наш конвертер:</p>
  <pre>import converter

print(converter.to_miles(10))</pre>
  <p>Теперь находясь в Anaconda Prompt мы можем проверить, что будет, если мы напрямую запустим наш конвертер и через скрипт выше:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/9f/8a/9f8a6ee3-9ef0-4790-b3de-3e32d442b859.png" width="975" />
  </figure>
  <p>Короче говоря <em>if __name__ == &#x27;__main__&#x27;</em> обрабатывает два случая, когда скрипт был запущен напрямую и когда скрипт был импортирован. В обоих случаях мы можем хотеть делать что-то разное и как раз это те блоки кода, которые потребуются нам, чтобы предпринять что-то в том или ином случае.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/BJLJA6AxL</guid><link>https://teletype.in/@aboutpython/BJLJA6AxL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/BJLJA6AxL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Модули и пакеты</title><pubDate>Fri, 17 Jan 2020 06:02:05 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></media:content><description><![CDATA[<img src="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></img>В Python можно создавать не только модули, но и пакеты.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg" width="1280" />
  </figure>
  <p>В Python можно создавать не только <strong>модули</strong>, но и <strong>пакеты</strong>.</p>
  <p>Что такое <strong>модуль </strong>- по сути дела модуль это скрипт с расширением <strong><em>.py</em></strong>, который может быть использован другими скриптами с расширением <strong><em>.py</em></strong>.</p>
  <p>А <strong>пакет </strong>- это объединенный набор модулей.</p>
  <p>По большому счету это вся разница между модулем и пакетами. То есть пакеты существуют для того, чтобы логически объединять модули.</p>
  <p>На самом деле с пакетами мы очень много уже работали, например, fizz_buzz и fizz_buzz_tests. Они у нас лежали в одном каталоге, и это два модуля, которые взаимодействуют между собой.</p>
  <p>Давайте попробуем создать пакет со структурой каталогов.</p>
  <p>Мы создали два скрипта:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/1f/d4/1fd445c7-154f-443f-97c6-474d36589288.png" width="424" />
  </figure>
  <figure class="m_original">
    <img src="https://teletype.in/files/a0/21/a02172ba-8e2f-4e15-a8e0-6d24c016fc8b.png" width="418" />
  </figure>
  <p>Чтобы пакеты воспринимались, как пакеты нужно так же создать файлы, которые называются <strong><em>__init__.py </em></strong>в каждом подкаталоге. Просто создаем текстовый файл и меняем ему название и расширение на это. Теперь импортируем пакет, назовем его <strong><em>package_test</em></strong> и сохраним рядом с папкой MainPackage.</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/bc/e9/bce96982-e13e-461f-8ac9-a38ae876ca86.png" width="443" />
  </figure>
  <p>Теперь вызовем <strong><em>package_test</em></strong>:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/fd/36/fd36160b-e369-488b-91b6-0b0a4d788c36.png" width="978" />
  </figure>
  <p>Как видим - все отлично отработало.</p>
  <p>Мы можем сделать псевдоним, то есть, если мы импортируем какой то скрипт, но хотим обращаться к нему не по его имени, то можем придумть ему другое имя через оператор <strong>as</strong>:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/5f/fb/5ffb268b-aada-4f80-9ac1-e1dd17d24a8b.png" width="431" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/S1ArQ7jlI</guid><link>https://teletype.in/@aboutpython/S1ArQ7jlI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/S1ArQ7jlI?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>PyPi и PiP</title><pubDate>Tue, 14 Jan 2020 11:17:26 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/cf/7b/cf7b97cb-cfc8-4375-9ecf-f42a6fa3b888.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/cf/7b/cf7b97cb-cfc8-4375-9ecf-f42a6fa3b888.png"></img>До сего момента мы использовали встроенные в Python библиотеки, то есть библиотеки, которыми можно пользоваться сразу, при этом ничего ниоткуда не скачивая. Однако, существует огромное количество задач, с нашей точки зрения, с точки зрения человека - бесконечное количество задач, и под все эти задачи библиотеки не встраивают в Python.]]></description><content:encoded><![CDATA[
  <p>До сего момента мы использовали встроенные в <strong>Python </strong>библиотеки, то есть библиотеки, которыми можно пользоваться сразу, при этом ничего ниоткуда не скачивая. Однако, существует огромное количество задач, с нашей точки зрения, с точки зрения человека - бесконечное количество задач, и под все эти задачи библиотеки не встраивают в <strong>Python</strong>.</p>
  <ul>
    <li>Если мы хотим поискать библиотеку вне встроенного пакета нашего дистрибутива, то для этого можно воспользоваться открытым открытым репозиторием библиотек или пакетов, который называется <strong>PyPi</strong>.</li>
    <li>Существует так же <strong>Pip </strong>- инсталлятор , который позволяет устанавливать любую библиотеку или пакета из этого <strong>PyPi</strong>. Все, что нам нужно - знать имя пакета, чтобы его установить.</li>
  </ul>
  <p>Давайте посмотрим, как это сделать.</p>
  <p>Поискать пакеты можно напрямую на сайте <a href="https://pypi.org/" target="_blank"><strong>PyPi.org</strong></a>, здесь можно напрямую пробить какое либо наименование или описание пакета, через него будет происходить поиск:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/cf/7b/cf7b97cb-cfc8-4375-9ecf-f42a6fa3b888.png" width="1900" />
  </figure>
  <p>Или можем пройти в<strong> <a href="https://pypi.org/search/" target="_blank">browse projects</a></strong> и использовать здесь фильтры ну и так далее. Короче говоря, все пакеты, что мы найдем на <strong>PyPi </strong>мы можем установить с помощью <strong>PiP</strong>.</p>
  <p></p>
  <p>Попробуем установить пакет, который называется <strong>ProgressBar</strong>, который позволяет пускать текстовый прогресс бар в командной строке. Для этого я выполню команду:</p>
  <pre>pip install progressbar</pre>
  <figure class="m_original">
    <img src="https://teletype.in/files/44/af/44af30bb-fb9a-4404-b516-88b7d1e92576.png" width="978" />
  </figure>
  <p>Как видно - у нас прошла загрузка данного пакета и он успешно установился.</p>
  <p>Воспользуемся нашим новым пакетом:</p>
  <pre>from progressbar import ProgressBar
import time

bar = ProgressBar(maxval=10)
bar.start()

for i in range(1, 11):
    bar.update(i)
    time.sleep(1)

bar.finish()</pre>
  <figure class="m_original">
    <img src="https://teletype.in/files/c6/1b/c61b4cd6-aaea-40db-bb5d-8dbd601d5429.png" width="976" />
  </figure>
  <p>У себя в консоли вы сможете увидеть исполнение.</p>
  <p>Вот таким образом  с помощью инсталятора <strong>PiP </strong>мы можем установить любой пакет, а затем его использовать так, как нам нужно.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/SyJv2KEeL</guid><link>https://teletype.in/@aboutpython/SyJv2KEeL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/SyJv2KEeL?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Магические методы</title><pubDate>Thu, 09 Jan 2020 11:19:51 GMT</pubDate><description><![CDATA[<img src="https://teletype.in/files/ce/f3/cef3ebaf-510d-4e54-bf8b-becc48b157be.png"></img>В начале 2020 года начнем с темы магических методов или Dunder методы. С помощью этих магических методов мы можем переопределять кое-какое поведение.]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/ce/f3/cef3ebaf-510d-4e54-bf8b-becc48b157be.png" width="400" />
  </figure>
  <p>В начале 2020 года начнем с темы магических методов или <strong>Dunder </strong>методы. С помощью этих магических методов мы можем переопределять кое-какое поведение.</p>
  <p>Давайте сразу приступим к примерам:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/7f/4f/7f4fc06f-67d6-40b7-910d-8cf228fbf514.png" width="239" />
  </figure>
  <p>У нас есть некая точка (<em>Point</em>), которая имеет координаты <strong>х </strong>и <strong>у</strong>. И вот в принципе <em>__init__</em> это один из <strong>Dunder </strong>методов. Но он специализированный и предназначается для конструирования класса. Если мы создадим сначала <em>Point</em> и выведем его через <strong>print</strong>, то получим вот такой вывод:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/59/28/59280000-af66-4141-b608-2e7ee894920f.png" width="358" />
  </figure>
  <p>А что, если мы хотим получить более красивый вывод, а не такую непонятную штуку? Мы можем переопределить <strong>Dunder </strong>метод <em>__str__</em>, который определяет строковое представление экземпляра класса:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/83/0f/830f0c54-4baf-49ce-a4b8-6abfd61150cf.png" width="365" />
  </figure>
  <p>Вуаля, у нас получился осмысленный ответ благодаря переопределнию <em>__str__</em>.</p>
  <p>Попробуем создать новый класс:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/01/a5/01a5fac1-9e0f-4ae3-95b5-f7f75995d948.png" width="378" />
  </figure>
  <p>Мы переназначили <em>__len__, __str__ и __del__</em>, а теперь посмотрим, как они вызываются, и что нам в итоге выведут, то ли, что мы хотели?</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/23/f6/23f658a4-33ee-448b-8e05-155fe1b81b7f.png" width="241" />
  </figure>
  <p>Вот, мы получили то, что хотели.</p>
  <p>В итоге, если мы хотим переопределить поведение определенных функций, то мы можем переопределить их с помощью такого синтаксиса. Просто используя знакомый нам синтаксис, который мы видели уже неоднократно :) На самом деле этих методов еще больше, и все их не охватить, поэтому можете изучить их в документакции по <strong>Python</strong>.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/Sy-BvMz1U</guid><link>https://teletype.in/@aboutpython/Sy-BvMz1U?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/Sy-BvMz1U?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Абстрактный класс и модуль ABC</title><pubDate>Thu, 26 Dec 2019 11:19:20 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/de/84/de84856c-a553-4c59-8f13-b3c4ee1e503c.png"></media:content><description><![CDATA[<img src="https://teletype.in/files/de/84/de84856c-a553-4c59-8f13-b3c4ee1e503c.png"></img>Сегодня мы еще раз затронем тему абстрактных классов. В прошлый раз, чтобы создать абстрактный класс от которого будут наследоваться другие классы и которые будут обязаны переопределять методы определенные в абстрактном классе мы использовали обычный класс и для того, чтобы запретить вызов методов в таком классе мы возбуждали ошибки с помощью ключевого слова raise. Но у нас есть и другая возможность объявлять абстрактные классы. Этот способ несколько более красивый и продвинутый, он операется на специальный модуль и декоратор, который предназначен для того, чтобы определять абстрактные классы. Этот модуль называется ABC, что означает - Abstract Base Class. Посмотрим, как мы можем им воспользоваться:]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/de/84/de84856c-a553-4c59-8f13-b3c4ee1e503c.png" width="1280" />
  </figure>
  <p>Сегодня мы еще раз затронем тему абстрактных классов. В прошлый раз, чтобы создать абстрактный класс от которого будут наследоваться другие классы и которые будут обязаны переопределять методы определенные в абстрактном классе мы использовали обычный класс и для того, чтобы запретить вызов методов в таком классе мы возбуждали ошибки с помощью ключевого слова <strong>raise</strong>. Но у нас есть и другая возможность объявлять абстрактные классы. Этот способ несколько более красивый и продвинутый, он операется на специальный модуль и декоратор, который предназначен для того, чтобы определять абстрактные классы. Этот модуль называется <strong>ABC</strong>, что означает - <strong>Abstract Base Class</strong>. Посмотрим, как мы можем им воспользоваться:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/63/1b/631bfeac-5452-41a2-b7b6-ac2353b165c3.png" width="584" />
  </figure>
  <p>Создадим новый класс, который будет наследовать наш абстрактный класс:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/34/a4/34a46e9b-c069-4994-9d80-9af7027b023f.png" width="623" />
  </figure>
  <p>Для того, чтобы продемонстрировать то, что мы не можем создать инстанцию класса Triangle, который наследуется от абстрактного класса не переопределяя абсолютно все абстрактные методы мы закомментируем периметр и вот, что сделаем дальше:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/e1/49/e149b1ad-2bb5-44fc-9de2-1523c2e61f0d.png" width="697" />
  </figure>
  <p>Мы получили TypeError, потому что нельзя прописывать класс, который наследуется от абстрактного класса не переопределив все абстрактные методы. Соответственно, если мы вернем реализацию и пересоздадим, то получи</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/c4/8f/c48f1f3f-be4e-4608-bcd4-e9da32abd3e4.png" width="605" />
  </figure>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/H1lLxNR0H</guid><link>https://teletype.in/@aboutpython/H1lLxNR0H?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/H1lLxNR0H?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Миксины</title><pubDate>Mon, 23 Dec 2019 12:17:12 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></media:content><description><![CDATA[<img src="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></img>Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. ]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg" width="1280" />
  </figure>
  <p>Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. </p>
  <p>Например, создадим класс <strong>Machine</strong>:</p>
  <figure class="m_custom">
    <img src="https://teletype.in/files/cf/7c/cf7cdd63-ed29-4bdd-b2f1-1a3113fc5f3f.png" width="563" />
  </figure>
  <p>Теперь вопрос, как подключить функционал радио к машине, именно к Car, таким образом, чтобы не добавлять его к самолету? Для этого можно использовать миксины. И вот как мы можем его сделать:</p>
  <figure class="m_custom">
    <img src="https://teletype.in/files/82/a9/82a9c5db-1aab-483f-b305-b98306965038.png" width="786" />
  </figure>
  <p>Вот таким образом мы примешали радио именно в Car и теперь може�� наслаждаться им в машине:</p>
  <figure class="m_custom">
    <img src="https://teletype.in/files/1a/fb/1afb05a5-b4d6-4b12-a2dc-d6b9f742acb5.png" width="210" />
  </figure>
  <p></p>
  <p>Как правило миксины не содержат атрибутов и методов с теми же наименованиями которые содержатся в иерархии классов к которым они примешиваются. И сами по себе миксины, не смотря на то, что это множественное наследование не подразумевает, что мы вообще строим именно <strong>Deadly Diamond of Death </strong>(ромб), про который я рассказывал в прошлом посте. Поэтому, как правило мы пользуемся множественным наследованием именно используя миксины, но миксины мы можем примешивать и к какой то иерархии классов, просто мы не выстариваем иерархии классов таким образом, чтобы возникали именно ромбы. Таким образом Python разрешает множественные наследования, но относиться следует к множественному наследованию с осторожностью, использовать классическое наследование можно, но ни в коем случае не создавать ромбы, ну и конечно же в любом количестве можно примешивать миксины, которые совершенно ничем не мешают ни наследникам, ни их базовым классам.</p>

]]></content:encoded></item><item><guid isPermaLink="true">https://teletype.in/@aboutpython/SJGERQ00H</guid><link>https://teletype.in/@aboutpython/SJGERQ00H?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython</link><comments>https://teletype.in/@aboutpython/SJGERQ00H?utm_source=teletype&amp;utm_medium=feed_rss&amp;utm_campaign=aboutpython#comments</comments><dc:creator>aboutpython</dc:creator><title>Миксины</title><pubDate>Mon, 23 Dec 2019 12:08:09 GMT</pubDate><media:content medium="image" url="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></media:content><description><![CDATA[<img src="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></img>Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. ]]></description><content:encoded><![CDATA[
  <figure class="m_original">
    <img src="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg" width="1280" />
  </figure>
  <p>Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. </p>
  <p>Например, создадим класс <strong>Machine</strong>:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/cf/7c/cf7cdd63-ed29-4bdd-b2f1-1a3113fc5f3f.png" width="563" />
  </figure>
  <p>Теперь вопрос, как подключить функционал радио к машине, именно к Car, таким образом, чтобы не добавлять его к самолету? Для этого можно использовать миксины. И вот как мы можем его сделать:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/82/a9/82a9c5db-1aab-483f-b305-b98306965038.png" width="786" />
  </figure>
  <p>Вот таким образом мы примешали радио именно в Car и теперь можем наслаждаться им в машине:</p>
  <figure class="m_original">
    <img src="https://teletype.in/files/1a/fb/1afb05a5-b4d6-4b12-a2dc-d6b9f742acb5.png" width="210" />
  </figure>
  <p></p>
  <p>Как правило миксины не содержат атрибутов и методов с теми же наименованиями которые содержатся в иерархии классов  к которым они примешиваются. И сами по себе миксины, не смотря на то, что это множественное наследование не подразумевает, что мы вообще строим именно <strong>Deadly Diamond of Death </strong>(ромб), про который я рассказывал в прошлом посте. Поэтому, как правило мы пользуемся множественным наследованием именно используя миксины, но миксины мы можем примешивать и к какой то иерархии классов, просто мы не выстариваем иерархии классов таким образом, чтобы возникали именно ромбы. Таким образом Python разрешает множественные наследования, но относиться следует к множественному наследованию с осторожностью, использовать классическое наследование можно, но ни в коем случае не создавать ромбы, ну и конечно же в любом количестве можно примешивать миксины, которые совершенно ничем не мешают ни наследникам, ни их базовым классам.</p>

]]></content:encoded></item></channel></rss>