Oto mój kod:Jak poprawnie dopasować obiekt?
class Hero:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name + str(self.age)
def __hash__(self):
print(hash(str(self)))
return hash(str(self))
heroes = set()
heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 1
heroes.add(Hero('Lara Miheenko', 17)) # gets hash -2822451113328084695
print(len(heroes)) # gets 2
heroes.add(Hero('Zina Portnova', 16)) # gets hash -8926039986155829407
print(len(heroes)) # gets 3! WHY?
Dlaczego tak się dzieje?
Pierwszy i trzeci obiekt mają tę samą zawartość i ten sam skrót, ale len()
mówi o 3 unikalnych obiektach?
Nie jestem pewien, ale prawdopodobnie trzeba swój '__eq__' lub' __cmp__' : http://docs.python.org/glossary.html#term-hashable – nhahtdh
Poza tym nie jest to najlepsza funkcja skrótu (ponieważ nie dodajesz ogólnego ciągu znaków, jeden z komponentów ciągu ma dużo niższą entropię ponieważ wiadomo, że składa się z cyfr). Dla trywialnej, ale dość skutecznej poprawki, pobierz wartości mieszania obiektów oddzielnie i xoruj je. Aby uzyskać więcej magii, dodaj je skalowane przez stałą liczbę pierwszą. –
@KonradRudolph: W twoim komentarzu kryje się domyślne założenie - konkretnie, że dobry "hasz" jest potrzebny, aby zestaw dobrze działał. Tak nie jest w przypadku implementacji "set" Pythona; patrz [ten komentarz ze źródeł Pythona] (http://hg.python.org/cpython/file/26e2ee402a0b/Objects/dictobject.c#l113) w celu uzyskania dalszych wyjaśnień. –