Python: Как наборы работают

У меня есть список объектов, которые я хочу превратиться в набор. Мои объекты содержат несколько полей что, некоторые из которых o.id и o.area. Я хочу два объекта быть равным, если эти два поля являются тем же. т.е.: o1==o2 если и только если o1.area==o2.area and o1.id==o2.id.

Я пытался перезаписать __eq__ и __cmp__ но я получаю ошибку: TypeError: unhashable instance.

Что я должен перезаписать?

25
задан SilentGhost 28 March 2010 в 09:05
поделиться

2 ответа

Определите метод __ hash __ для возврата значимого хэша на основе полей id и area. Например: [

def __hash__(self):
    return hash(self.id) ^ hash(self.area)
38
ответ дан 28 November 2019 в 20:57
поделиться

"TypeError : unhashable instance. " ошибка, вероятно, связана с определением класса в старом стиле, например:

class A:
  pass

Вместо этого используйте новый стиль:

class A(object):
  pass

Если вы переопределите функцию __cmp__, вы должны переопределить __hash__ для использования вашего объекта в наборах. В другом случае хеш считает все экземпляры объектов неравными, и функция __cmp__ никогда не будет вызвана.

9
ответ дан 28 November 2019 в 20:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: