Когда вы переопределяете __eq__ в классе, вам также нужно переопределить __hash__? - PullRequest
1 голос
/ 06 июля 2019

Я делаю класс узлов в Python 3, который я буду хранить в минимально упорядоченной структуре из нескольких деревьев. Я переопределил метод __eq__, который проверяет равенство, сравнивая две уникальные целочисленные переменные экземпляра.

  1. Будет ли этот подход работать для поиска узлов в структуре путем сравнения равенства?
  2. Мне также нужно переопределить __hash__?

Ответы [ 2 ]

3 голосов
/ 06 июля 2019

Да, вы должны переопределить __hash__.

Общее правило: если два экземпляра равны (по отношению к __eq__, т. Е. a==b имеет значение True), то они должны иметь одинаковый хэш. В противном случае все виды вещей могут плохо себя вести.

Кроме того, для меня это звучит __eq__ недостаточно для минимума. По крайней мере, вам нужно определить __lt__.

1 голос
/ 06 июля 2019

Я делаю класс узлов в Python 3, который я буду хранить в минимально упорядоченной структуре из нескольких деревьев

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

Но это очень сильные ограничения, которые на самом деле не могут быть применены. И нет никакой пользы от , а не переопределения __hash__, чтобы соответствовать __eq__. Так что вы все равно должны это сделать.

...