파이썬에서 해시 가능한 객체
__hash__
. Compreender esse conceito ajuda a entender como as estruturas de dados Python funcionam, uma vez que o hash dos objetos são utilizados internamente.Programadores Python costumam se deparar com o conceito de hash de objetos quando tentam armazenar um objeto sem hash em uma estrutura de dados da linguagem. 예를 들면:
from dataclasses import dataclass
@dataclass
class Pessoa:
nome: str
cpf: str
p = Pessoa(nome="Ítalo Epifânio", cpf="1010101010")
pessoas = set()
pessoas.add(p)
O código acima define uma classe pessoa e um objeto
p
티포 페소아를 하세요. Ao tentar adicionar uma pessoa ao conjunto pessoas
o seguinte erro é lançado:Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'Pessoa'
이 작업은 Python을 활용하는 "conjunto"에 대한 결정을 내릴 수 있도록 합니다. 우리는 모든 사물을 해시하지 않고 오류가 있을 수 있습니다.
Para adicionar um hash a um object implementa-se as funções
__hash__
e__eq__
동시에 사용할 수 있습니다(Python 2는 기능 __ne__
추가로 사용할 수 있습니다). Seguir modificamos nossa classe anterior para adquirir essa propriedade의 예는 없습니다.@dataclass
class Pessoa:
nome: str
cpf: str
def __hash__(self):
return hash(self.cpf)
def __eq__(self, other):
mesma_classe = self.__class__ == other.__class__
mesmo_cpf = self.cpf == other.cpf
return mesma_classe and mesmo_cpf
p = Pessoa(nome="Ítalo Epifânio", cpf="101.010.101-01")
pessoas = set()
pessoas.add(p)
코드가 실행되는 곳은 전면에 있습니다. Se execuarmos
print(pessoas)
veremos que o conjunto contém o seguinte valor:{Pessoa(nome='Ítalo Epifânio', cpf=1010101010)}
Um objeto é dito hashable se o valor de hash nunca é modificado durante sua fase de vida
-- Python Docs
Apenas implementar os dunder métodos acima não garante que o objeto é hashable. É preciso garantir o valor de hash desse objeto jamais sejá alterado pois isso pode levar a comportamentos não esperados, por exemplo:
p = Pessoa(nome="Ítalo Epifânio", cpf="101.010.101-01")
pessoas = set()
pessoas.add(p)
print(p in pessoas) # retorna True
p.cpf = "999.999.999-99"
print(p in pessoas) # retorna False
print(pessoas) # retorna {Pessoa(nome='Ítalo Epifânio', cpf='999.999.999-99')}
Ao alterar o cpf do objeto
p
note que o objeto não é mais encontrado na estrutura de dados conjunto (a segunda chamada do print(p in pessoas)
retorna falso) e quando lista-se os valores do conjunto pessoas
Nota-se que há ainda um valor lá.이력서: você não pode basear hash de objetos em valores mutáveis. Se o atributo de um objeto pode ser modificado durante seu ciclo de vida comportamentos inesperados podem acontecer.
Reference
이 문제에 관하여(파이썬에서 해시 가능한 객체), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/itepifanio/objetos-hashable-em-python-3gj1텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)