Коробка с питоном
523 subscribers
49 photos
128 links
Заметки от Python-разработчика: сниппеты, обзоры пакетов, новости и другая полезная информация.
Download Telegram
Несколько методов для эмуляции числовых типов

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

Например, мы можем сделать класс для представления двухмерных векторов, которые могут складываться между собой создавая новый вектор или умножать вектор на скаляр.

>>> v1 = Vector2D(1, 1)
>>> v2 = Vector2D(5, 6)
>>> v1 + v2
Vector(6, 7)
>>> v1 * 3
Vector(3, 3)

GitHub
#std
Коробка с питоном
Несколько методов для эмуляции числовых типов В питоне есть магические методы, которые позволяют складывать или умножать между собой объекты. Рассмотрим их. Например, мы можем сделать класс для представления двухмерных векторов, которые могут складываться…
Возвращайте NotImplemented для неподдерживаемых бинарных операций с вашим типом

В комментариях к предыдущему посту возник вопрос, что если вместо целочисленного scalar к нам придет float или какой-то другой тип?

Естественно, код в посте выше будет работать с ошибками, поэтому явно было бы выбросить исключение, но оказывается что так делать не нужно!

Оказывается, в Python есть следующий механизм: если метод представляющий бинарную операцию (__add__, __mul__ и т.д.) возвращает NotImplemented, то Python попытается произвести отраженную операцию (для x.__mul__(1) вызовет 1.__rmul__(x), например) или другие операции, в зависимости от оператора. Как только все возможные методы вернут NotImplemented он сам возбудит исключение на месте вызова метода в вашем коде, а не в коде класса:

>>> v1 = Vector2D(1, 2)
>>> v1 * 1.1
TypeError: unsupported operand type(s) for *: 'Vector2D' and 'float'

Списки магических методов и рекомендации по их реализации можно найти в разделе Data model

GitHub | Объяснение "на пальцах"
#std