Python. Наследование

Перевод параграфа 6.4 Inheritance из книги Intermediate Python.

Наследование — это механизм создания новых классов. Наследники специализируют или изменяют базовые классы добавляя в них новую функциональность. Python поддерживает множественное наследование как C++. Пример одиночного наследования в Python:

Читать далее Python. Наследование

Python. Абстрактные базовые классы

Перевод параграфа 6.7 Abstract Base Classes из книги Intermediate Python.

Чтобы классы реализовывали заданный набор методов в статически типизированных языках, таких как Java, используются интерфейсы и абстрактные классы.

Простая реализация такого контракта в Python — добавить в базовый класс методы по умолчанию, выбрасывающие исключение NotImplementedError. Такое решение неполное: наследники могут не переопределить все методы базового класса, а проблема обнаружится только во время выполнения программы.

Рассмотрим другую ситуацию — использование одного объекта для замещения другого. Заместитель перехватывает все вызовы и передаёт их в скрываемый объект. Заместитель реализует все нужные методы, но проверку типа через isinstance он не проходит, так как имеет тип отличный от замещаемого объекта.

В Python такие задачи решаются через абстрактные базовые классы, реализуемые модулем abc. Этот модуль определяет мета-класс и набор декораторов. Для определения абстрактного базового класса мы устанавливаем ABCMeta как мета-класс абстрактного класса и помечаем декораторами @abstractmethod и @abstractproperty методы и свойства которые должны быть реализованы в неабстрактных потомках.

Читать далее Python. Абстрактные базовые классы

Python. Статические и классовые методы

Перевод параграфа 6.5 Static and Class Methods из книги Intermediate Python.

По умолчанию методы определённые в классе работают с экземплярами класса. Для определения статических и классовых методов применяются декораторы @staticmethod и @classmethod.

Статичные методы

Статичные методы это обычные функции внутри пространства имён класса. Ссылка на статичный метод из класса возвращает функцию вместо несвязанного метода:

Декоратор @staticmethod используется для определения статического метода. Такой метод не требует аргумента self.

Читать далее Python. Статические и классовые методы

Triangle Quest

Разберём две математические задачи с Hackerrank: Triangle Quest и Triangle Quest 2.

Дано число от 1 до 9 и нужно вывести треугольники из чисел заданного вида. Для числа 4 в первой задаче:

а во второй:

Для вывода допустимо использовать только один цикл, процедуру print и математические операции:

Читать далее Triangle Quest

Сходство информационного стиля и программного кода

Правила информационного стиля из книги Пиши-сокращай похожи на принципы написания хорошего кода. Источник сходства в единой основе кода, статей и книг — в тексте предназначенном в первую очередь для чтения.

Стоп-слова

Тексты в информационном стиле не содержат лишних слов. Редактор целенаправленно ищет и удаляет лишние слова и конструкции.

Существуют конструкции нежелательные на любом языке программирования, такие как сравнение с логической переменной и присвоение True и False:

Опытный разработчик заменяет такую конструкцию одной строкой:

Структура

Писатель делит текст на абзацы. Абзацы структурируют текст. Структурированный текст проще читать.

Разработчики разделяют команды на логические блоки пустыми строками:

Для выделения уровня вложенности используют отступы:

Модуль

Писатель делит статью на части. Каждая часть обозначается информативным заголовком. Каждая часть описывает отдельную тему, законченную сложную мысль. Внутри части абзацы связаны друг с другом, но снаружи отдельная часть не имеет жёстких связей с другими частями. Части можно перемещать относительно друг друга, а в некоторых случаях даже вырезать в другие статьи.

Разработчик делит программу на функции и модули. Функциям и модулям даются информативные названия. Функции и модули имеют определённое назначение. Модули имеют высокую связность внутри и низкую снаружи — с другими модулями. Как модули так и функции подразумевают возможность повторного использования.

Oracle. Как не нужно генерировать первичный ключ

Идея поста возникал при прочтении Получение в программе значения первичного ключа после INSERT.

В Oracle младше 12 версии нет автоинкрементного поля. Стандратный способ генерации первичных ключей — последовательности. Но иногда разработчики генерируют первичный ключ таким способом:

Это приводит к проблемам при многопользовательской работе. Типичная ситуация — пользователи одновременно получают новое значение для ПК, а потом вставляют записи:

Пользователь1Пользователь2
select max(rid) + 1 from table
select max(rid) + 1 from table
insert
insert

В результате второй пользователь зависает из-за блокировки. Если же первый пользователь зафиксирует данные, то у второго сработает ограничение по первичному ключу:

Пользователь1Пользователь2
select max(rid) + 1 from table
select max(rid) + 1 from table
insert
insert
commit
ORA-00001: нарушено ограничение уникальности

Для генерации ПК следует использовать последовательности или специальные механизмы вроде GUID. Иначе будут возникать ошибки.

Математика с нуля

Математика с нуля

Сайт Математика с нуля содержит уроки базовой математики — на уровне начальной и средней школы.

Этот сайт примечателен детальностью подачи материала. Каждая тема рассматривается на нескольких примерах. В конце каждой темы десяток задач для самостоятельного решения.

Сейчас на сайте 63 урока. Периодически добавляются новые.

Пиши, сокращай. Отжать воду

Первая часть книги Пиши, сокращай описывает как очистить текст от лишних слов — стоп-слов. Стоп-слова не несут информации и затрудняют чтение. Общий алгоритм работы со стоп-словами:

  1. Выучить группы стоп-слов. Разобраться почему они вредны.
  2. Научится видеть стоп-слова.
  3. Удалить мусор без вреда смыслу.
  4. Наполнить текст полезной информацией.

В книге стоп-слова разделены на 8 групп. Для их быстрого повторения я составил интеллект-карту:

Пиши, сокращай. Стоп-слова

Python. Имена и связывание

Пост написан на основе части 4.1 книги Intermediate Python. Obi Ike-Nwosu.

В Python, на объекты ссылаются через имена. Имена аналогичны переменным в C++ или Java.

В примере выше, x — имя которое ссылается на объект 5. Процесс присваивания ссылки на 5 в x называется связыванием. Связывание приводит к тому что имя ассоциируется с объектом.

Связывание происходит в разных ситуациях: при присваивании и при вызове методов, когда параметры связываются с аргументами.

Важная особенность: имена являются только ссылками без связанного с ними типа; имена ссылаются на объекты которые имеют тип.

Присваивание создаёт новое имя в самой внутренней области видимости программы. Если присваивание выполняется в коде модуля — имя добавляется в глобальные переменные модуля, если в коде функции — в локальные переменные функции.

Python. Выражение, строки и отступы

Пост написан на основе части 3.2 книги Intermediate Python. Obi Ike-Nwosu.

Программа на Python состоит из логических строк ограниченных токеном NEWLINE. Каждая логическая строка эквивалентна простому оператору. Составные операторы формируются из нескольких логических строк.

Логическая строка создаётся из одной или нескольких физических строк используя явные или не явные правила объединения строк. Физическая строка — это последовательность символов завершающаяся символами перевода строки (end-of-line sequence). Python неявно рассматривает физические строки как логические, устраняя необходимость в точке с запятой для разделения выражений. Однако точка с запятой может использоваться для разделения одной физической строки на несколько логических:

Читать далее Python. Выражение, строки и отступы