Абстрактные классы и методы
В абстрактном классе обычно реализуется общая часть нескольких сущностей или другими словами – абстрактная сущность.
Абстрактный метод – это метод, который не имеет своей реализации в базовом классе, и он должен быть реализован в классе-наследнике.
Для того, чтобы создать абстрактный класс с абстрактными методами, надо импортировать вспомогательные метакласс
Если мы отнаследуем новый класс от абстрактного класса, не переопределив абстрактные методы, в данном случае
Для того, чтобы код заработал корректно, нам необходимо переопределить все абстрактные методы. То есть по сути еще раз просто написать метод, но уже в новом классе.
UPD. В коде опечатка, в классе
#классы #метаклассы #abc
В абстрактном классе обычно реализуется общая часть нескольких сущностей или другими словами – абстрактная сущность.
Абстрактный метод – это метод, который не имеет своей реализации в базовом классе, и он должен быть реализован в классе-наследнике.
Для того, чтобы создать абстрактный класс с абстрактными методами, надо импортировать вспомогательные метакласс
ABCMeta
и декоратор abstractmethod
из модуля abc
.Если мы отнаследуем новый класс от абстрактного класса, не переопределив абстрактные методы, в данном случае
method
, и попробуем создать экземпляр, то получим исключение TypeError
.Для того, чтобы код заработал корректно, нам необходимо переопределить все абстрактные методы. То есть по сути еще раз просто написать метод, но уже в новом классе.
UPD. В коде опечатка, в классе
GoodExample
метод должен называться method
, а не function
.#классы #метаклассы #abc
Находим файлы по шаблону
Основной фишкой модуля
В одноименный метод
Вообще модуль является встроенным, но в некоторых ситуациях импорт может выдать исключение. В таком случае надо просто его переустановить через пакетный менеджер
#glob
Основной фишкой модуля
glob
является удобная и лаконичная работа с поиском файлов по паттернам. Более того, можно даже пройтись по директориям рекурсивно.В одноименный метод
glob
передаётся шаблон для поиска файлов, а возвращается список с результатами. Все методы следуют механизму и правилам сопоставления паттернов в стиле Unix. Вообще модуль является встроенным, но в некоторых ситуациях импорт может выдать исключение. В таком случае надо просто его переустановить через пакетный менеджер
pip
.#glob
Разница между генераторными выражениями и генераторами коллекций
Записи в первой и второй строчке в коде выше очень похожи, но различаются видами скобок. В генераторе списка они квадратные, а в генераторном выражении – круглые.
Распечатав переменные, можно заметить, что значением переменной
Если вам нужен результат, например в виде списка, прямо сейчас для дальнейшего выполнения программы, то используйте генераторы коллекций.
А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
#генераторы
Записи в первой и второй строчке в коде выше очень похожи, но различаются видами скобок. В генераторе списка они квадратные, а в генераторном выражении – круглые.
Распечатав переменные, можно заметить, что значением переменной
a
является список, а переменная x
хранит в себе объект генератора. И здесь возникает вопрос, что же использовать.Если вам нужен результат, например в виде списка, прямо сейчас для дальнейшего выполнения программы, то используйте генераторы коллекций.
А если же значения понадобятся еще не скоро или вообще неизвестно, понадобится ли они вообще, то предпочтительнее генераторы, чтобы не занимать лишнюю память и не нагружать систему.
#генераторы
Перегрузка операторов
Сначала стоит напомнить, что методы, которые начинаются и заканчиваются двойными нижними подчеркиваниями, называются магическими.
Например, выше в классе
Для перегрузки оператора
Таким образом, когда разработчик пишет запись
#классы
Сначала стоит напомнить, что методы, которые начинаются и заканчиваются двойными нижними подчеркиваниями, называются магическими.
Например, выше в классе
Point
мы определили __str__
, который отвечает за то, как выводятся объекты класса на экран.Для перегрузки оператора
"+"
нужно определить метод __add__
. Он принимает два аргумента, которыми являются, соответственно, операнды в операции сложения.Таким образом, когда разработчик пишет запись
p1 + p2
, интерпретатор воспринимает это в виде Point.__add__(p1, p2)
. Для всех операторов в языке, включая и логические, есть свои магические методы. #классы
Минималистичный ORM
Для любителей работать с базами данных SQLite 3 или MySQL наш подписчик разрабатывает простой и эффективный способ взаимодействия – библиотека mysqlite.
Такая компактная ORM является промежуточным этапом между работой со всеми знакомым SQLAlchemy и использованием чистого SQL у себя в коде.
Проект находится на ранней стадии разработки. Тем не менее, CRUD операции уже реализованы, а также присутствует несколько вспомогательных методов.
P. S. Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Для любителей работать с базами данных SQLite 3 или MySQL наш подписчик разрабатывает простой и эффективный способ взаимодействия – библиотека mysqlite.
Такая компактная ORM является промежуточным этапом между работой со всеми знакомым SQLAlchemy и использованием чистого SQL у себя в коде.
Проект находится на ранней стадии разработки. Тем не менее, CRUD операции уже реализованы, а также присутствует несколько вспомогательных методов.
P. S. Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Простой вариант абстрактного метода
На канале буквально недавно выходил пост про создание абстрактных методов через пакет
Сейчас ради разнообразия покажем вариант попроще. В родительском классе можно объявить метод, который будет вызывать исключение. Таким образом, если в дочернем классе его не переопределять, мы получим то, что и требовалось.
Но здесь есть существенный минус – при создании экземпляра класса, наследованного от подобного родителя, не возникнет ошибки. Только вызов метода выдаст исключение. А такое поведение является не очень явным для абстрактного класса.
#классы
На канале буквально недавно выходил пост про создание абстрактных методов через пакет
abc
. И такой вариант всё ещё является наиболее правильным и оптимальным. Сейчас ради разнообразия покажем вариант попроще. В родительском классе можно объявить метод, который будет вызывать исключение. Таким образом, если в дочернем классе его не переопределять, мы получим то, что и требовалось.
Но здесь есть существенный минус – при создании экземпляра класса, наследованного от подобного родителя, не возникнет ошибки. Только вызов метода выдаст исключение. А такое поведение является не очень явным для абстрактного класса.
#классы
Удаление префиксов и суффиксов
По какой-то неизведанной причине многие разработчики посчитали эту фичу в обновлении 3.9 не очень интересной и попросту забыли. И зря.
Некоторые на полном серьезе для таких целей до сих пор пытаются использовать забагованные
И всё же, в Python 3.9 были добавлены методы для строк
#строки
По какой-то неизведанной причине многие разработчики посчитали эту фичу в обновлении 3.9 не очень интересной и попросту забыли. И зря.
Некоторые на полном серьезе для таких целей до сих пор пытаются использовать забагованные
.strip
и .lsrtip
. Точнее, большинство просто не до конца понимают, как работают эти два метода.И всё же, в Python 3.9 были добавлены методы для строк
.removeprefix
и .removesuffix
, предназначенные специально для удаления префиксов и суффиксов в строках.#строки
Упрощение создания операторов сравнения
Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно –
Про то, что делает каждый из них расскажем отдельным постом, но сейчас покажем, как можно сильно упростить реализацию подобного класса. Для этого можно использовать декоратор
В таком случае достаточно реализовать в классе только
#классы
Для создания объектов с поддержкой операторов сравнения в классе обычно требуется реализовать большое количество магических методов, а именно –
__lt__
, __le__
, __eq__
, __ne__
, __gt__
, __ge__
.Про то, что делает каждый из них расскажем отдельным постом, но сейчас покажем, как можно сильно упростить реализацию подобного класса. Для этого можно использовать декоратор
total_ordering
из пакета functools
.В таком случае достаточно реализовать в классе только
__lt__
и __eq__
. Эти два метода являются минимумом, который нужен декоратору для конструирования остальных методов.#классы
Первые шаги в Python
Специально для начинающих сделали универсальную подборку ресурсов для изучения Python с полного нуля.
Подборка включает в себя бесплатные онлайн-курсы, книги, YouTube каналы, сайты для практики и другое.
Читать 2 минуты
#статья
Специально для начинающих сделали универсальную подборку ресурсов для изучения Python с полного нуля.
Подборка включает в себя бесплатные онлайн-курсы, книги, YouTube каналы, сайты для практики и другое.
Читать 2 минуты
#статья
Перегрузка операторов сравнения
В случае, если вам в коде необходимо сравнивать объекты какого-либо класса, требуется реализовать магические методы, которые вызываются при сравнении.
Например, под капотом записи
Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор
#классы
В случае, если вам в коде необходимо сравнивать объекты какого-либо класса, требуется реализовать магические методы, которые вызываются при сравнении.
Например, под капотом записи
a < b
вызывается a.__lt__(b)
. Для каждого оператора сравнения существует свой магический метод. Подробнее про то, какой метод за какой оператор отвечает, выше в коде. Писать все шесть методов получается слегка громоздко, поэтому зачастую используют декоратор
total_ordering
из functools
. Про него, кстати, недавно писали пост. #классы
Быстрое написание ботов ВК
Библиотека LiteVkApi написана на основе обычного VK API для упрощения написания ботов для ВК. Пакет позволяет абстрагироваться от работы с API и сконцентрироваться на самом боте.
В примере скрипт отправляет сообщение "И тебе привет!", если боту написали "Привет!". Присылает клавиатуру с кнопками "Привет!" и "Закрыть клавиатуру!" на команду "Клавиатура". А на фразу "Закрыть клавиатуру" бот её удалит с экрана пользователя.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Библиотека LiteVkApi написана на основе обычного VK API для упрощения написания ботов для ВК. Пакет позволяет абстрагироваться от работы с API и сконцентрироваться на самом боте.
В примере скрипт отправляет сообщение "И тебе привет!", если боту написали "Привет!". Присылает клавиатуру с кнопками "Привет!" и "Закрыть клавиатуру!" на команду "Клавиатура". А на фразу "Закрыть клавиатуру" бот её удалит с экрана пользователя.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Список импортов по умолчанию
Для ограничения импорта переменных, функций и классов по умолчанию можно использовать список
Таким образом, при импорте вида
Тем не менее, в примере выше импортировать функцию
#модули
Для ограничения импорта переменных, функций и классов по умолчанию можно использовать список
__all__
, в который записываются названия объектов, которые будут подключены.Таким образом, при импорте вида
from module import *
из модуля c подобной записью подключатся только объекты с названиями из списка __all__
.Тем не менее, в примере выше импортировать функцию
foo
из такого модуля всё ещё можно, например, с помощью записи from module import foo
.#модули
База данных на минималках
Встроенный модуль
Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
В документации заявляют, что такая база данных является "надежной". Но учитывая, что
#shelve
Встроенный модуль
shelve
позволяет сохранять и читать произвольные данные. Таким образом, можно сохранять любые Python объекты для дальнейшего использования. Доступ к данным осуществляется с помощью ключей, как и в случае со словарями. А метод
shelve.open
поддерживает протокол контекстного менеджера, то есть можно не вызывать метод close
. В документации заявляют, что такая база данных является "надежной". Но учитывая, что
shelve
написан на pickle
, его стоит использовать только в совсем маленьких проектах.#shelve
Сохраняем бинарные данные
Модуль
Но классы, функции и методы сохранить не получится. Здесь также важно понимать, что при сохранении объекта сохраняется строка, указывающая, к какому классу относится этот объект.
Однако будьте осторожнее,
#pickle
Модуль
pickle
, который мы затронули в прошлом посте, реализует двоичные протоколы для сериализации и десериализации объектов. Вы можете сохранить любой объект, если возможно перевести каждый его атрибут в двоичный вид. Но классы, функции и методы сохранить не получится. Здесь также важно понимать, что при сохранении объекта сохраняется строка, указывающая, к какому классу относится этот объект.
Однако будьте осторожнее,
pickle
не защищен от ошибочных или вредоносных данных. Никогда не извлекайте данные, полученные из ненадежных или не прошедших проверку подлинности источников.#pickle
Пишем асинхронных ботов для ВК
Под постом про проект подписчика, связанный с написанием ВК ботов, в комментариях упомянули про модуль
Библиотека является асинхронной и требует минимум кода со стороны разработчика, что позволяет сконцентрироваться на задаче, не тратя силы и время на само взаимодействие с API.
Код, написанный на
#боты #vk
Под постом про проект подписчика, связанный с написанием ВК ботов, в комментариях упомянули про модуль
vkbottle
, про который сейчас и расскажем.Библиотека является асинхронной и требует минимум кода со стороны разработчика, что позволяет сконцентрироваться на задаче, не тратя силы и время на само взаимодействие с API.
Код, написанный на
vkbottle
, чем-то похож на всем знакомый flask
. А пример выше реализует бота, который отвечает сообщением "Здравствуй!" на "Привет". #боты #vk
Задай свой вопрос в нашем чате
Если вы ещё не знаете, то у нас есть активный чат, в котором уже 1200+ участников.
Присоединяйтесь, задавайте свои вопросы и не забывайте помогать другим.
@python_academy_chat
Если вы ещё не знаете, то у нас есть активный чат, в котором уже 1200+ участников.
Присоединяйтесь, задавайте свои вопросы и не забывайте помогать другим.
@python_academy_chat
Django Telegram Logger
Наш подписчик написал удобное расширение для фреймворка Django, которое представляет из себя логгер для Telegram. Можете ознакомиться с исходным кодом.
Модуль устанавливается через пакетный менеджер
И ещё надо указать токен бота в Telegram и
в файле настроек Django.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Наш подписчик написал удобное расширение для фреймворка Django, которое представляет из себя логгер для Telegram. Можете ознакомиться с исходным кодом.
Модуль устанавливается через пакетный менеджер
pip
. Для его настройки требуется добавить "telegram_logger"
в INSTALLED_APPS
, а также "TelegramLoggerMiddleware"
в MIDDLEWARE_CLASSES
. И ещё надо указать токен бота в Telegram и
user_id
аккаунта, на который будут приходить уведомления. Это всё делается в словаре TELEGRAM_LOGGER_CONF
в файле настроек Django.
Присылайте свои проекты в личные сообщения @a1f20. Про самое интересное расскажем на канале.
#проектподписчика
Аннотации типов: Union и Optional
Ранее на канале был пост про базовые аннотации типов. Но важно знать и про такие аннотации, как
При необходимости допустить использование не любых типов, а только некоторых, можно использовать аннотацию
Для объявления опциональных переменных используется
Кстати, аннотация
#аннотации
Ранее на канале был пост про базовые аннотации типов. Но важно знать и про такие аннотации, как
Union
и Optional
.При необходимости допустить использование не любых типов, а только некоторых, можно использовать аннотацию
Union[T, ...]
с указанием списка типов в квадратных скобках.Для объявления опциональных переменных используется
Optional[T]
. Такая аннотация нужна для переменных, которые либо имеют значение определенного типа, либо равны None
.Кстати, аннотация
Optional[T]
эквивалентна Union[T, None]
. #аннотации
Заменяем часть строки
Со строками в Python работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является
Первым аргументом передается подстрока, которая будет изменяться в исходной строке. Вторым аргументом — то, на что будет заменяться.
Также есть третий, опциональный, аргумент, который отвечает за то, сколько раз вы хотите заменить старую подстроку на новую. По умолчанию, все вхождения заменяются.
#строки
Со строками в Python работать очень удобно, так как встроенных методов для них предостаточно. Одним из методов является
str.replace()
, который позволяет заменять части строк.Первым аргументом передается подстрока, которая будет изменяться в исходной строке. Вторым аргументом — то, на что будет заменяться.
Также есть третий, опциональный, аргумент, который отвечает за то, сколько раз вы хотите заменить старую подстроку на новую. По умолчанию, все вхождения заменяются.
#строки
Создаем пакеты
Пакет в Python — это, грубо говоря, папка с другими папками и модулями. Помимо разделения частей проекта, пакеты нужны для формирования пространства имен, чтобы можно работать с пакетами и модулями через точку, как в примере выше.
При импорте вида
Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.
#модули #пакеты
Пакет в Python — это, грубо говоря, папка с другими папками и модулями. Помимо разделения частей проекта, пакеты нужны для формирования пространства имен, чтобы можно работать с пакетами и модулями через точку, как в примере выше.
При импорте вида
from package import *
будет подключены либо все модули и объекты модуля __init__.py
, либо то, что находится в переменной __all__
в том же модуле __init__.py
— подробнее про эту переменную было в посте ранее.Также примечателен файл init.py, который раньше был обязателен для создания пакетов. С версии Python 3.3 его необходимость пропала. Однако его функциональность на этом не заканчиваются.
#модули #пакеты
Создаем виртуальное окружение
Виртуальное окружение — это изолированная среда, которая имеет свои локальные интерпретатор и пакеты, независимые от глобального интерпретатора и других окружений.
В стандартной библиотеке Python третьей версии есть пакет
Скрипт
В случае успешного создания и активации у вас в терминале должно появится название вашего виртуального окружения в круглых скобках.
#venv
Виртуальное окружение — это изолированная среда, которая имеет свои локальные интерпретатор и пакеты, независимые от глобального интерпретатора и других окружений.
В стандартной библиотеке Python третьей версии есть пакет
venv
, который позволяет создавать виртуальные окружения удобно и быстро. Пример представлен на картинке. Скрипт
activate
в директории bin
предназначен для активации окружения, а команда deactivate
в уже активированном окружении — для выхода из него.В случае успешного создания и активации у вас в терминале должно появится название вашего виртуального окружения в круглых скобках.
#venv