Почему оператор Python!= Считает, что аргументы равны и не равны одновременно?
Возьмем следующий пример:
>>> class C(object):
... def __init__(self, p):
... self.p = p
... def __eq__(self, o):
... return True
...
>>> C(1) is C(2)
False
>>> C(1) == C(2)
True
>>> C(1) != C(2)
True # <- Why?!?
Итак, теперь оба объекта равны и не равны в одно и то же время. Я, хотя две операции противоположны?!
Ответы
Ответ 1
Pythons "Модель данных" объясняет все это:
Между операторами сравнения нет подразумеваемых отношений. Истина x==y
не означает, что x!=y
является ложным. Соответственно, при определении __eq__()
следует также определить __ne__()
, чтобы операторы действовали должным образом.
В C(1) != C(2)
используется его реализация по умолчанию, где объекты равны только себе и не соответствуют всем остальным.
Определение __cmp__
может быть проще, поскольку оно используется как резерв для всех операций сравнения, а не только некоторые из них:
... def __cmp__(self, o):
... return 0
>>> C(1) != C(2)
False
Ответ 2
Существует отдельная функция для !=
, которая __ne__
, которая неявно определена для сравнения членов экземпляра.
Что вы хотите сделать:
def __ne__(self, other):
return not self.__eq__(other)
или некоторый вариант этого.
Ответ 3
Вы должны определить как __ne__
, так и __eq__
. И вам, вероятно, следует подумать о внедрении __cmp__
тоже!