Ответ 1
Вы не нашли super(bool, True).__lt__
, потому что int
использует устаревший метод __cmp__
вместо богатых сравнений на Python 2. Он int.__cmp__
.
Он не реализован непосредственно на bool.
>>> True.__lt__(2)
AttributeError: 'bool' object has no attribute '__lt__'
И он, по-видимому, не реализован на int
:
>>> super(bool, True).__lt__(2)
AttributeError: 'super' object has no attribute '__lt__'
Для управления операцией нет отраженной версии __lt__
для 2
, а поскольку тип int
не является подклассом bool
, который никогда не будет работать.
Python 3 ведет себя как ожидалось:
>>> True.__lt__(2)
True
Итак, как True < 2
реализован в Python 2?
Вы не нашли super(bool, True).__lt__
, потому что int
использует устаревший метод __cmp__
вместо богатых сравнений на Python 2. Он int.__cmp__
.
True
равен 1 в Python (поэтому он меньше 2) и bool
является подклассом int
: в основном, False
и True
равны 0 и 1 с funky repr()
s.
Что касается реализации сравнения по целым числам, Python использует __cmp__()
, который является способом старой записи в Python. (Python 3 не поддерживает __cmp__()
, поэтому он реализован как __lt__()
там.) См. https://docs.python.org/2/reference/datamodel.html#object.__cmp__
True
- это просто имя, которое относится к объекту типа int
, в частности значение 1. Выражение True < 2
равно 1 < 2
. То же самое, False
равно 0. В Python 2 у вас есть метод __cmp__
, который возвращает 0, если значения равны, -1, если одно значение слишком велико, чем другое значение, и 1, если одно значение меньше, чем другое стоимость. Пример:
>>> True.__cmp__(1)
0
>>> True.__cmp__(0)
1
>>> True.__cmp__(-1)
1
>>> True.__cmp__(0)
1
>>> True.__cmp__(1)
0
>>> True.__cmp__(2)
-1
В Python 3 у вас есть методы __lt__
и __gt__
, которые являются эквивалентами <
и >
.