хорошие методы __eq__, __lt__, ..., __hash__ для класса изображений? - PullRequest
2 голосов
/ 31 марта 2010

Я создаю следующий класс:

class Image(object):
    def __init__(self, extension, data, urls=None, user_data=None):
        self._extension = extension
        self._data = data
        self._urls = urls
        self._user_data = user_data
        self._hex_digest = hashlib.sha1(self._data).hexDigest()

Изображения должны быть равны, когда все значения равны. Поэтому я написал:

    def __eq__(self, other):
        if isinstance(other, Image) and self.__dict__ == other.__dict__:
            return True
        return False

    def __ne__(self, other):
        return not self.__eq__(other)

    def __lt__(self, other):
        return self.__dict__ < other.__dict__
    ...

Но как должен выглядеть метод __hash__? Равные изображения должны возвращать равные хэши ...

    def __hash__(self):
        # won't work !?!  
        return hash(self.__dict__)

Способ, которым я пытаюсь использовать __eq__, __ne__, __lt__, __hash__, ..., рекомендую?

Ответы [ 2 ]

5 голосов
/ 31 марта 2010

Вам действительно нужно заказать изображения? Если нет, я бы отказался от метода __lt__. Для __hash__ помните, что два неравных объекта могут иметь одинаковое хеш-значение, поэтому вы можете просто выбрать один из ваших атрибутов (или использовать набор из нескольких атрибутов), чтобы получить хеш-код. Пример:

def __hash__(self):
    return hash(self._hex_digest)
1 голос
/ 31 марта 2010

Вы смотрели правила для словарного сравнения?

Проверьте здесь: http://docs.python.org/reference/expressions.html#notin

Это не совсем ясно (пока). Это может быть определено в документе «Что нового».

Однако небольшие тесты показывают, что это выполнимо.

>>> a= { 'a':1, 'b':2 }
>>> b= { 'a':2, 'b':2 }
>>> a == a
True
>>> a == b
False
>>> a < b
True
>>> a > b
False
>>> a >= b
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...