Почему оператор 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__ тоже!