метод cmp это не работает, как ожидалось в Python 2.x?
class x:
def __init__(self,name):
self.name=name
def __str__(self):
return self.name
def __cmp__(self,other):
print("cmp method called with self="+str(self)+",other="+str(other))
return self.name==other.name
# return False
instance1=x("hello")
instance2=x("there")
print(instance1==instance2)
print(instance1.name==instance2.name)
вывод здесь:
cmp method called with self=hello,other=there
True
False
что не то, что я ожидал: я пытаюсь сказать: "два экземпляра равны, если поля имен равны".
если я просто return False
С __cmp__
функция, это сообщает как True
как хорошо!!
Если я вернусь -1
, то я False
- но так как я пытаюсь сравнить строки, это не кажется правильным.
что я здесь делаю не так?
5 ответов
__cmp__(x,y)
должна возвращать отрицательное число (например, -1), если x < y
положительное число (например, 1) Если x > y
и 0, если x == y
. Вы никогда не должны возвращать boolean с ним.
что ты перегрузка __eq__(x, y)
.
на __cmp__
метод должен возвращать -1, 0 или 1, когда self other respectvelly.
можно сделать
return cmp(self.name, other.name)
в коде для правильного результата
ты путаешь __cmp__
С __eq__
.
должно возвращать отрицательное целое число, если self other.
__eq__
возвращает логическое значение, определяющее, равны ли два объекта,__cmp__
возвращает целое число, которое определяет, являются ли два объекта больше или меньше друг друга, и поэтому вызывается, если у вас нет специфический __eq__
, __ne__
, __le__
, __ge__
, __lt__
и __gt__
методы.
в вашем случае вы хотите __cmp__
метод, а не __eq__
поскольку это сэкономит вам реализацию других 5 методов для других сравнений.
можно использовать cmp()
функции и поместите следующее в свой __cmp__
способ:
return cmp(self.name,other.name)
Примечание как подчеркнул Игнасио это не является предпочтительным методом в В Python 3.0, но в Python 2.x __cmp__
- это путь.
__cmp__()
это отживающие. Определить __lt__()
, __eq__()
и .
даже если так, вы делаете это неправильно. Вы должны вернуть целое число.
поиск документации для __cmp__
, вы должны вернуть целое число:
должна возвращать отрицательное число, если self other.