ООП: композиция
Композиция — это отношение, при котором объекты одного класса связаны с объектами другого. Такой способ организации взаимодействия между классами также называется ассоциацией.
Как правило, в этом случае объект одного из классов (в примере выше это
Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора.
В таком случае необходимо использовать слабые ссылки из модуля
#классы #ооп
Композиция — это отношение, при котором объекты одного класса связаны с объектами другого. Такой способ организации взаимодействия между классами также называется ассоциацией.
Как правило, в этом случае объект одного из классов (в примере выше это
Salary
) является полем другого (Employee
). Сложного здесь, как вы видите, ничего нет.Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора.
В таком случае необходимо использовать слабые ссылки из модуля
weakref
, о котором поговорим позже.#классы #ооп
Заглушка в коде
В ходе исполнения оператора
Например, вам надо сделать несколько функций, вы написали
Или в конструкции
#pass
В ходе исполнения оператора
pass
ничего не происходит, поэтому он может использоваться в качестве некой заглушки в тех местах, где это синтаксически необходимо.Например, вам надо сделать несколько функций, вы написали
def'ы
и названия, но сам код еще не успели, однако программу надо запустить и проверить что-то другое. Вот тут и понадобится pass
.Или в конструкции
try-except
, чтобы просто проигнорировать и никак не обрабатывать ошибку в программе.#pass
Скачиваем вебсайты целиком
Максимально простой, но при этом мощный пакет
Функция
А вот
Но здесь надо быть аккуратнее, подобная рекурсивная загрузка отправит много запросов к серверу и может сильно нагрузить его, если на сайте много страниц.
#pywebcopy
Максимально простой, но при этом мощный пакет
pywebcopy
поможет вам клонировать отдельные веб-страницы или даже целые сайты. Функция
save_webpage
скачивает страницу по указанной ссылке, в аргументы также можно передать путь, куда сохранить результат. А вот
save_website
дает возможность скачать целый вебсайт рекурсивно. Например, если сайт представляет из себя блог, то скрипт скачет все статьи, которые есть на сайте. Но здесь надо быть аккуратнее, подобная рекурсивная загрузка отправит много запросов к серверу и может сильно нагрузить его, если на сайте много страниц.
#pywebcopy
Познакомьтесь с IceCream: Улучшенным выводом в Python
Hедавно мы наткнулись на потрясающий инструмент для отладки и разработки в
Что такое
Преимущества
1. Читабельность и простота в использовании:
2. Цветовая кодировка:
Настройка
Это добавит контекст, такой как имя файла и номер строки, в вывод:
Автор идеи поста:
Если у вас есть предложения для следующего поста, делитесь в комментариях!
#Python #logging #icecream
Hедавно мы наткнулись на потрясающий инструмент для отладки и разработки в
Python
, и хотим поделиться им с вами! Представляем вам icecream
- библиотеку, которая упрощает отладку, улучшая вывод ваших данных.Что такое
icecream
?icecream
- это легковесная библиотека для Python
, которая предоставляет простые, но мощные инструменты для отслеживания и вывода значений переменных и данных в процессе выполнения кода. Этот инструмент полезен при отладке, тестировании и разработке, помогая вам лучше понять, что происходит в вашей программе.Преимущества
icecream
перед стандартным print
:1. Читабельность и простота в использовании:
icecream
автоматически выводит имя переменной и ее значение, что делает вывод более понятным и читабельным.2. Цветовая кодировка:
icecream
поддерживает цветовую кодировку вывода, что делает его более наглядным и удобным для анализа.Настройка
icecream
:icecream
позволяет настраивать вывод, добавлять дополнительную информацию, и даже сохранять логи в файл. Вы можете настроить icecream
в соответствии с вашими потребностями, делая вывод более информативным и удобным.from icecream import ic, install
install(autodetect=True, includeContext=True)
number = 42
ic(number)
text = "Привет, мир!"
ic(text)
Это добавит контекст, такой как имя файла и номер строки, в вывод:
ic| <ipython-input-1-5a0d5d83d2d3>:1 in <module> - number: 42
ic| <ipython-input-1-5a0d5d83d2d3>:4 in <module> - text: 'Привет, мир!'
Автор идеи поста:
@hexvel
Если у вас есть предложения для следующего поста, делитесь в комментариях!
#Python #logging #icecream
Работаем с картинками в Python
Библиотека Pillow — это очень мощный, быстрый и удобный инструмент для обработки графики в Python.
В сегодняшнем примере мы применим ее для конвертации картинки в черно-белую, обратим цвета, вертикально отзеркалим и сохраним в файл.
Метод
Библиотека Pillow — это очень мощный, быстрый и удобный инструмент для обработки графики в Python.
В сегодняшнем примере мы применим ее для конвертации картинки в черно-белую, обратим цвета, вертикально отзеркалим и сохраним в файл.
Метод
Image.open('resources/img/cat.jpg')
считывает картинку из папки. img.convert('L')
трансформирует картинку в черно-белую. ImageOps.invert(image)
обращает цвета. img.transpose(Image.FLIP_LEFT_RIGHT)
вертикально отзеркаливает картинку. img.save('grayscale_cat.jpg')
сохранит картинку на диске.Отправляем универсальные уведомления
Наткнулся на интересный пакет notifiers, который позволяет отправлять уведомления на почту, через Телеграм бота, в Слэк и еще много куда. Всего доступно 16 провайдеров, подробнее про них в документации.
В функцию get_notifier передаем название провайдера в виде строки и получаем объект, с которым можно работать. Отправить уведомление можно с помощью универсального метода notify.
Если не уверены, какие аргументы нужно передать для отправки уведомления, то можете посмотреть их через атрибут required у созданного объекта.
Например, для Телеграма нужно передать токен бота, айди чата и само сообщение. В случае с почтой необходимо указать логин, пароль, адресата и также сообщение.
#уведомления #notifiers
Наткнулся на интересный пакет notifiers, который позволяет отправлять уведомления на почту, через Телеграм бота, в Слэк и еще много куда. Всего доступно 16 провайдеров, подробнее про них в документации.
В функцию get_notifier передаем название провайдера в виде строки и получаем объект, с которым можно работать. Отправить уведомление можно с помощью универсального метода notify.
Если не уверены, какие аргументы нужно передать для отправки уведомления, то можете посмотреть их через атрибут required у созданного объекта.
Например, для Телеграма нужно передать токен бота, айди чата и само сообщение. В случае с почтой необходимо указать логин, пароль, адресата и также сообщение.
#уведомления #notifiers
14–15 декабря VK Tech проведёт Weekend Offer для Python-разработчиков и инженеров. Это шанс присоединиться к работе над крупнейшей облачной платформой страны VK Cloud и вместе с VK Tech помогать бизнесу расти.
Узнайте больше о вакансиях и откликайтесь здесь.
Флоу простой: оставляете заявку, общаетесь с рекрутерами, выбираете слоты для собеседований и проходите их в назначенное время. О результате VK Tech сообщит вскоре после финального интервью.
Откликайтесь до 13 декабря включительно.
Узнайте больше о вакансиях и откликайтесь здесь.
Флоу простой: оставляете заявку, общаетесь с рекрутерами, выбираете слоты для собеседований и проходите их в назначенное время. О результате VK Tech сообщит вскоре после финального интервью.
Откликайтесь до 13 декабря включительно.
Протоколы
Термины "протокол итератора" или "протокол дескрипторов" уже привычны и используются давно. Но теперь можно описывать протоколы в виде кода и проверять их соответствие на этапе статического анализа.
Протокол описывается как обычный класс, наследующийся от
Хоть это и не совсем интерфейсы, но все же классная штука. Еще важно, что протоколы, как и все остальные фишки аннотаций типов, используются в основном со статически типизированным
#typing #аннотации
Термины "протокол итератора" или "протокол дескрипторов" уже привычны и используются давно. Но теперь можно описывать протоколы в виде кода и проверять их соответствие на этапе статического анализа.
Протокол описывается как обычный класс, наследующийся от
Protocol
. Он может иметь методы (в том числе с реализацией) и поля. Реальные классы, реализующие протокол могут наследоваться от него, но это не обязательно, как показано в примере. Хоть это и не совсем интерфейсы, но все же классная штука. Еще важно, что протоколы, как и все остальные фишки аннотаций типов, используются в основном со статически типизированным
mypy
. #typing #аннотации
Добавляем классу большую функциональность
На прошлой неделе мы объясняли декоратор
Зачем использовать. Статические методы делают код более читабельным и повторно используемым. Его также удобнее использовать для импорта по сравнению с обычными функциями, поскольку функцию не нужно отдельно импортировать.
В чем же разница?
На прошлой неделе мы объясняли декоратор
@classmethod
, а сейчас рассмотрим @staticmethod
. @staticmethod
можно воспринимать как метод, который "не знает, к какому классу относится". Он просто получает переданные аргументы, без неявного первого аргумента, и его определение не изменяется через наследование. Еще раз: статические методы прикреплены к классу лишь для удобства — и не могут менять состояние ни класса, ни его экземпляра.Зачем использовать. Статические методы делают код более читабельным и повторно используемым. Его также удобнее использовать для импорта по сравнению с обычными функциями, поскольку функцию не нужно отдельно импортировать.
В чем же разница?
@classmethod
используется в суперклассе для определения того, как метод должен вести себя, когда он вызывается разными дочерними классами. @staticmethod
используется, когда мы хотим вернуть объект, независимо от вызываемого дочернего класса.Использование списков в качестве стеков
Стек – абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (last in – first out). В переводе с английского "последним пришёл – первым вышел".
Списки в Python имеют удобные встроенные методы, которых достаточно для реализации такой структуры данных. Для добавления элемента в конец стека используем метод
Программный вид стека применяется для обхода структур по типу графов и деревьев. При реализации рекурсивных функций также будет применяться стек, но в таком случае уже его аппаратный вид.
#списки #стек
Стек – абстрактный тип данных, представляющий собой список элементов, организованных по принципу LIFO (last in – first out). В переводе с английского "последним пришёл – первым вышел".
Списки в Python имеют удобные встроенные методы, которых достаточно для реализации такой структуры данных. Для добавления элемента в конец стека используем метод
append
, для извлечения – pop
.Программный вид стека применяется для обхода структур по типу графов и деревьев. При реализации рекурсивных функций также будет применяться стек, но в таком случае уже его аппаратный вид.
#списки #стек
Делаем HTTP запросы
Пакет
Устанавливается
Модуль идеально подходит как для работы со внешними API веб-сервисов, так и для получения HTML кода веб-страниц.
#requests
Пакет
requests
абстрагирует сложности выполнения запросов за красивым, простым API, чтобы вы могли сосредоточиться на взаимодействии с сервисами и работе с данными в ваших приложениях.Устанавливается
requests
стандартным путем через пакетный менеджер pip
. Запросы GET, POST, PUT и DELETE делаются интуитивно понятно. Атрибуты у объекта Response
позволяют получить всю информацию об ответе от сервера.Модуль идеально подходит как для работы со внешними API веб-сервисов, так и для получения HTML кода веб-страниц.
#requests
Более простой способ создания контекстных менеджеров
Почти год назад на канале было объяснение про то, что такое контекстные менеджеры и зачем они нужны. Также был пост, показывающий, как создавать классы с использованием протокола менеджера контекста.
Но не всегда хочется реализовывать магические методы __enter__ и __exit__. В качестве альтернативы есть один классный прием в пакете
Первая часть функции
#contextlib
Почти год назад на канале было объяснение про то, что такое контекстные менеджеры и зачем они нужны. Также был пост, показывающий, как создавать классы с использованием протокола менеджера контекста.
Но не всегда хочется реализовывать магические методы __enter__ и __exit__. В качестве альтернативы есть один классный прием в пакете
contextlib
. Там протокол управления контекстом реализован с использованием декоратора contextmanager
. Первая часть функции
tag
, которая идёт до yield
, выполняется при входе в блок with
. Затем исполняется сам этот блок, а после этого завершается оставшаяся часть функции tag
. #contextlib
Перегрузка операторов
Сначала стоит напомнить, что методы, которые начинаются и заканчиваются двойными нижними подчеркиваниями, называются магическими.
Например, выше в классе
Для перегрузки оператора
Таким образом, когда разработчик пишет запись
#классы
Сначала стоит напомнить, что методы, которые начинаются и заканчиваются двойными нижними подчеркиваниями, называются магическими.
Например, выше в классе
Point
мы определили __str__
, который отвечает за то, как выводятся объекты класса на экран.Для перегрузки оператора
"+"
нужно определить метод __add__
. Он принимает два аргумента, которыми являются, соответственно, операнды в операции сложения.Таким образом, когда разработчик пишет запись
p1 + p2
, интерпретатор воспринимает это в виде Point.__add__(p1, p2)
. Для всех операторов в языке, включая и логические, есть свои магические методы. #классы
Метод setdefault()
Метод
Метод
— Ключ, по которому необходимо получить значение.
— Значение по умолчанию, которое будет добавлено в словарь, если ключ отсутствует.
Если ключ присутствует в словаре, метод возвращает значение, связанное с этим ключом. Если ключ отсутствует в словаре, метод добавляет ключ в словарь со значением по умолчанию, а затем возвращает это значение.
#python
Метод
setdefault()
в Python возвращает значение по указанному ключу из словаря. Если ключ отсутствует в словаре, метод добавляет ключ в словарь со значением по умолчанию, а затем возвращает это значение.Метод
setdefault()
имеет два параметра:— Ключ, по которому необходимо получить значение.
— Значение по умолчанию, которое будет добавлено в словарь, если ключ отсутствует.
Если ключ присутствует в словаре, метод возвращает значение, связанное с этим ключом. Если ключ отсутствует в словаре, метод добавляет ключ в словарь со значением по умолчанию, а затем возвращает это значение.
#python
Обрабатываем номера телефонов
Пакет
Основным классом, который представляет номер, является
В целом, пакет использовать достаточно просто, базовые примеры есть на картинке. Также можете посмотреть документацию для более продвинутого использования.
#python #phonenumbers
Пакет
phonenumbers
основан на библиотеке libphonenumber от Google, которая позволяет форматировать, парсить и проверять номера телефонов.Основным классом, который представляет номер, является
PhoneNumber
. Объект можно создать, вызвав метод parse()
и передав в аргументы номер телефона в виде строки. Вторым аргументом также можно указать страну.В целом, пакет использовать достаточно просто, базовые примеры есть на картинке. Также можете посмотреть документацию для более продвинутого использования.
#python #phonenumbers
pow()
В Python функция pow() используется для вычисления степени числа. Вот как она работает:
где: x — основание степени,
y — показатель степени,
z (необязательный параметр) — модуль, по которому производится вычисление.
Если z указан, то pow(x, y, z) возвращает (x y) % z. Если z не указан, то возвращается x y.
#python
В Python функция pow() используется для вычисления степени числа. Вот как она работает:
result = pow(x, y, z)
где: x — основание степени,
y — показатель степени,
z (необязательный параметр) — модуль, по которому производится вычисление.
Если z указан, то pow(x, y, z) возвращает (x y) % z. Если z не указан, то возвращается x y.
#python
Распознаем речь используя SpeechRecognition
Эта библиотека упрощает процесс интеграции голосовых команд и обработки аудиоданных в ваших проектах. Благодаря широкому спектру возможностей,
#python #speechrecognition
SpeechRecognition
— это библиотека на Python
, которая предоставляет возможность использовать API для распознавания речи от различных компаний, таких как Google, Microsoft, IBM и другие. Кроме того, она поддерживает работу в офлайн-режиме.Эта библиотека упрощает процесс интеграции голосовых команд и обработки аудиоданных в ваших проектах. Благодаря широкому спектру возможностей,
SpeechRecognition
подходит для создания приложений с голосовым управлением, интеллектуальных ассистентов и многого другого.#python #speechrecognition
Упрощение создания операторов сравнения
Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно –
Про то, что делает каждый из них расскажем отдельным постом, но сейчас покажем, как можно сильно упростить реализацию подобного класса. Для этого можно использовать декоратор
В таком случае достаточно реализовать в классе только
#классы
Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно –
__lt__
, __le__
, __eq__
, __ne__
, __gt__
, __ge__
.Про то, что делает каждый из них расскажем отдельным постом, но сейчас покажем, как можно сильно упростить реализацию подобного класса. Для этого можно использовать декоратор
total_ordering
из пакета functools
.В таком случае достаточно реализовать в классе только
__lt__
и __eq__
. Эти два метода являются минимумом, который нужен декоратору для конструирования остальных методов.#классы
База данных на минималках
Встроенный модуль
Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
В документации заявляют, что такая база данных является "надежной". Но учитывая, что
#shelve
Встроенный модуль
shelve
позволяет сохранять и читать произвольные данные. Таким образом, можно сохранять любые Python объекты для дальнейшего использования. Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
shelve.open
поддерживает протокол контекстного менеджера, то есть можно не вызывать метод close
. В документации заявляют, что такая база данных является "надежной". Но учитывая, что
shelve
написан на pickle
, его стоит использовать только в совсем маленьких проектах.#shelve