Несколько методов для эмуляции числовых типов
В питоне есть магические методы, которые позволяют складывать или умножать между собой объекты. Рассмотрим их.
Например, мы можем сделать класс для представления двухмерных векторов, которые могут складываться между собой создавая новый вектор или умножать вектор на скаляр.
#std
В питоне есть магические методы, которые позволяют складывать или умножать между собой объекты. Рассмотрим их.
Например, мы можем сделать класс для представления двухмерных векторов, которые могут складываться между собой создавая новый вектор или умножать вектор на скаляр.
>>> v1 = Vector2D(1, 1)
>>> v2 = Vector2D(5, 6)
>>> v1 + v2
Vector(6, 7)
>>> v1 * 3
Vector(3, 3)
GitHub#std
Коробка с питоном
Несколько методов для эмуляции числовых типов В питоне есть магические методы, которые позволяют складывать или умножать между собой объекты. Рассмотрим их. Например, мы можем сделать класс для представления двухмерных векторов, которые могут складываться…
Возвращайте NotImplemented для неподдерживаемых бинарных операций с вашим типом
В комментариях к предыдущему посту возник вопрос, что если вместо целочисленного scalar к нам придет float или какой-то другой тип?
Естественно, код в посте выше будет работать с ошибками, поэтому явно было бы выбросить исключение, но оказывается что так делать не нужно!
Оказывается, в Python есть следующий механизм: если метод представляющий бинарную операцию (
GitHub | Объяснение "на пальцах"
#std
В комментариях к предыдущему посту возник вопрос, что если вместо целочисленного scalar к нам придет float или какой-то другой тип?
Естественно, код в посте выше будет работать с ошибками, поэтому явно было бы выбросить исключение, но оказывается что так делать не нужно!
Оказывается, в Python есть следующий механизм: если метод представляющий бинарную операцию (
__add__, __mul__ и т.д.) возвращает NotImplemented, то Python попытается произвести отраженную операцию (для x.__mul__(1) вызовет 1.__rmul__(x), например) или другие операции, в зависимости от оператора. Как только все возможные методы вернут NotImplemented он сам возбудит исключение на месте вызова метода в вашем коде, а не в коде класса:>>> v1 = Vector2D(1, 2)Списки магических методов и рекомендации по их реализации можно найти в разделе Data model
>>> v1 * 1.1
TypeError: unsupported operand type(s) for *: 'Vector2D' and 'float'
GitHub | Объяснение "на пальцах"
#std
Как работает bool()?
Python может принимать любой объект в булевом контексте. Чтобы определить, является ли выражение истинным или ложным, применяется функция
По умолчанию, объект попытается вызвать метод
Резюмируя, получается такая цепочка:
Python может принимать любой объект в булевом контексте. Чтобы определить, является ли выражение истинным или ложным, применяется функция
bool(x), которая должна вернуть булево значение (True или False).По умолчанию, объект попытается вызвать метод
__bool__, который должен вернуть булево значение. Если реализованного метода нет, то Python попытается вызвать __len__, который должен вернуть 0 или значение больше ноля - при ноле результатом будет False, соответственно при значении больше ноля - True. Если ни один метод не реализован, то автоматически вернется True.Резюмируя, получается такая цепочка:
__bool__ → __len__ → True
#stdНемного фактов про str() и repr()
-
-
- Если метод
А что вы можете сказать про
#std
-
repr() вызывает метод __repr__ объекта, а метод str(), собственно __str__.-
repr() вызывается интерактивной оболочкой, при попытке вывести объект.- Если метод
__str__ в объекте не определен, то вызывается __repr__. А что вы можете сказать про
str() и repr()? Пишите ниже, в комментарии 👇#std
Коробка с питоном
Немного фактов про str() и repr() - repr() вызывает метод __repr__ объекта, а метод str(), собственно __str__. - repr() вызывается интерактивной оболочкой, при попытке вывести объект. - Если метод __str__ в объекте не определен, то вызывается __repr__. …
Когда использовать __str__ или __repr__?
Оба магических метода используются для получения строкового представления объекта. Но как их лучше использовать - можно увидеть на картинке.
Таким образом имеем, что
#std
Оба магических метода используются для получения строкового представления объекта. Но как их лучше использовать - можно увидеть на картинке.
Таким образом имеем, что
__repr__ должен использоваться для предоставлении информации об объекте разработчику, а __str__ должен быть читаемым и использоваться для представления информации пользователю.#std