Метод удаления списка Python: как реализация? - PullRequest
0 голосов
/ 23 июля 2010

В Java у меня есть клиентский класс с атрибутом "code" и методом equals.Метод equals получает другого клиента и сравнивает его с самим кодом attr.

В python я только что прочитал, что у нас есть метод __cmp__, чтобы сделать то же самое, что java-метод equals.Хорошо, я сделал этоЯ создал свой клиент класса с помощью «кода» attr и метода comp, которые проверяют, является ли код тем же.

class Client():
    def __init__(self, code):
        self.code = code

    def __cmp__(self, obj):
        return obj.code == self.code

    def __repr__(self):
        return str(self.code)

Затем я помещаю 3 объекта Client в список питона:

bla = [Client(1), Client(2), Client(3)]

Затем, когда я пытаюсь:

bla.remove(Client(3))

Удивительный питон удаляет первый элемент (Клиент с кодом 1).

Что я делаю не так?Я искал реализацию списка в файлах библиотеки Python, но найти его нелегко.

Кто-нибудь может помочь?

Ответы [ 2 ]

5 голосов
/ 23 июля 2010

http://docs.python.org/reference/datamodel.html#object.__cmp__

__cmp__(self, other)

Вызывается операциями сравнения, если богатое сравнение (см. выше) не определены. Должен вернуть отрицательный целое число, если я <другой, ноль, если я == другое, положительное целое, если self> other.

По сути, вам следует изменить реализацию __cmp__ на ...

def __cmp__(self, obj):
    return cmp(obj.code, self.code)

Встроенная функция Python cmp() специально предназначена для возврата значений, которые __cmp__ должен возвращать, сравнивая два аргумента.

Существует также другая функция в Python, называемая __eq__, которая проверяет только равенство, для которой лучше подойдет ваша текущая реализация __cmp__.

4 голосов
/ 23 июля 2010

Звучит так, как будто вы действительно хотите __eq__

class Client():
    def __init__(self, code):
        self.code = code

    def __eq__(self, obj):
        return obj.code == self.code

    # this is how you usually write cmp, Amber explained the problem
    def __cmp__(self, other):
        return cmp(self.code, other.code)

    def __repr__(self):
        return str(self.code)

Кстати, в вашем примере с ошибками, __cmp__ возвращает False, как и ожидалось.Но в Python False == 0 и возврат 0 из __cmp__ означает, что сравниваемые элементы равны.Вот почему он удаляет первый элемент!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...