Ihre Lesung ist falsch. Die __eq__
-Methode wird für Gleichheitsprüfungen verwendet. Die Dokumente geben nur an, dass der Wert __hash__
für zwei Objekte a
und b
, für die a == b
(d. H. a.__eq__(b)
) gilt, gleich sein muss.
Dies ist ein gemeinsamer Logikfehler: a == b
ist True bedeutet, dass hash(a) == hash(b)
auch True ist. Die Implikation bedeutet jedoch nicht notwendigerweise Äquivalenz, die hash(a) == hash(b)
würde bedeuten, dass a == b
.
Um alle Instanzen von MyClass
vergleichbar zu machen, müssen Sie eine __eq__
Methode für sie bereitstellen; andernfalls vergleicht Python ihre Identitäten stattdessen.Dies könnte tun:
class MyClass(object):
def __hash__(self):
return 0
def __eq__(self, other):
# another object is equal to self, iff
# it is an instance of MyClass
return isinstance(other, MyClass)
Jetzt:
>>> result = set()
>>> result.add(MyClass())
>>> result.add(MyClass())
1
In Wirklichkeit werden Sie die __hash__
auf jenen Eigenschaften des Objekts stützen, die für __eq__
Vergleich verwendet werden, zum Beispiel:
class Person
def __init__(self, name, ssn):
self.name = name
self.ssn = ssn
def __eq__(self, other):
return isinstance(other, Person) and self.ssn == other.ssn
def __hash__(self):
# use the hashcode of self.ssn since that is used
# for equality checks as well
return hash(self.ssn)
p = Person('Foo Bar', 123456789)
q = Person('Fake Name', 123456789)
print(len({p, q}) # 1