метод 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__.

из документации __cmp__:

должно возвращать отрицательное целое число, если 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.