В чем разница между методами __int__ и __index__ в Python 3?
Раздел "Модель данных" документации Python 3.2 содержит следующие описания методов __int__
и __index__
:
object.__int__(self)
Вызывается для реализации встроенной функции [function int()
]. Должно возвращать [целое число].
object.__index__(self)
Вызывается operator.index()
. Также вызывается всякий раз, когда Python нуждается в целочисленном объекте (например, при нарезке или во встроенных функциях bin()
, hex()
и oct()
). Необходимо вернуть целое число.
Я понимаю, что они используются для разных целей, но я не мог понять, почему нужны два разных метода. В чем разница между этими методами? Является ли безопасным только псевдоним __index__ = __int__
в моих классах?
Ответы
Ответ 1
См. PEP 357: разрешить использование любого объекта для нарезки.
Метод nb_int
используется для принуждения и поэтому означает что-то принципиально отличающийся от того, что запрашивается здесь. Этот PEP предлагает метод для того, что уже можно представить себе как целое число передает эту информацию на Python, когда она нуждается в целое число. Самый большой пример того, почему использование nb_int
будет плохой Дело в том, что объекты float уже определяют метод nb_int
, но float объекты не должны использоваться как индексы в последовательности.
Изменить: похоже, что он был реализован в Python 2.5.
Ответ 2
Я верю, что вы найдете ответ в PEP 357, который имеет этот реферат:
Этот PEP предлагает добавить nb_index слот в PyNumberMethods и __index__ специальный метод, позволяющий использовать произвольные объекты когда целые числа явно необходимы в Python, например, в срезе синтаксис (из которого слот получает свое имя).