Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Existe a necessidade de implementar um HashCode também ?

Olá,

Vim do mundo Java e aprendi que lá é interessante implementar não somente o método equals, mas também o método HashCode, para que haja um uso eficiente de collections (principalmente Sets e HashMaps). Existe algo parecido no Python ? Eu vi que tem um dunder __hash__ também. Mas o pessoal que desenvolve Python tem o costume de utiliza-lo juntamente com o __eq__?

2 respostas
solução!

Oi Lucas, tudo bem?

Quando implementamos o __eq_ é interessante que também implementemos o __ne__. Apesar de que a partir do Python 3, o operador != retorna automaticamente o inverso do retorno do método __eq__(), se o método __ne__() não tiver sido implementado.

Porém, se sua classe herdar de outra em que o método __ne__() é definido (como é nos tipos primitivos), o comportamento do != se baseará no que é especificado nesse método, não no inverso do __eq__()! Por conta disso, é recomendável sempre declarar o método __ne__() quando quisermos implementar o __eq__(), tanto pela compatibilidade com o Python 2, quanto para evitar possíveis problemas em nosso código.

Quanto ao uso do __hash__ , ele retorna o valor do hash de um objeto se ele tiver um. E sua implementação juntamente com o __eq_ é válida quando:

  • Formos substituir o __eq__ e o objeto for imutável.

Porém, a partir do Python 3, ele automaticamente torna as classes laváveis(um objeto é lavável se tiver um valor de hash que nunca muda durante sua vida útil) ​​se você implementar o __eq__ mas não __hash__, então não há muitas preocupações quanto a isso.

Deixo abaixo alguns artigos sobre o assunto:

Qualquer dúvida estou a disposição. Espero ter ajudado. Abraços e bons estudos!

Muito bom Nádia, ficou mais claro para mim agora. Obrigado :)