Почему оператор 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?!?
Итак, теперь два объекта равны и не равны одновременно. Я хоть две операции противостоим?!
3 ответа
Модель данных Python объясняет все это:
Не существует никаких подразумеваемых отношений между операторами сравнения. Правда о
x==y
не означает, чтоx!=y
ложно Соответственно при определении__eq__()
следует также определить__ne__()
так что операторы будут вести себя как положено.
В C(1) != C(2)
он использует реализацию по умолчанию, где объекты равны только себе и неравны всем остальным.
определяющий __cmp__
может быть проще, так как используется как запасной вариант для всех операций сравнения, а не только для некоторых из них:
... def __cmp__(self, o):
... return 0
>>> C(1) != C(2)
False
Есть отдельная функция для !=
который __ne__
который неявно определяется для сравнения членов экземпляра.
Что вы хотите сделать, это:
def __ne__(self, other):
return not self.__eq__(other)
или какой-то вариант этого.
Вы должны определить оба __ne__
а также __eq__
, И вы, вероятно, должны рассмотреть вопрос о реализации __cmp__
тоже!