あなたの読みは間違っています。メソッドは__eq__
等価チェックに使用されます。ドキュメントは、__hash__
値が2つのオブジェクトに対しても同じでなければならないと述べa
ているだけで、 (つまり )はtrueです。b
a == b
a.__eq__(b)
これはよくある論理の誤りです。a == b
真であるということは、それもまた真であることを意味しhash(a) == hash(b)
ます。ただし、含意は必ずしも同等性を意味するわけではなく、事前確率に加えて、それhash(a) == hash(b)
を意味しa == b
ます。
compareのすべてのインスタンスをMyClass
互いに等しくするには、__eq__
それらのメソッドを提供する必要があります。それ以外の場合、Python は代わりに IDを比較します。これは次のようになります。
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)
今:
>>> result = set()
>>> result.add(MyClass())
>>> result.add(MyClass())
1
実際には、比較に__hash__
使用されるオブジェクトのプロパティに基づいています。次に例を示します。__eq__
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