クラスをハッシュ可能にする標準的な方法がいくつかあります。たとえば ( SOから借用):
# assume X has 2 attributes: attr_a and attr_b
class X:
def __key(self):
return (self.attr_a, self.attr_b)
def __eq__(x, y):
return isinstance(y, x.__class__) and x.__key() == y.__key()
def __hash__(self):
return hash(self.__key())
ここで、ハッシュ可能にしたいクラスがたくさんあるとします。それらはすべて不変であり、不変の属性を持ち、これらすべての属性をまとめてハッシュすることは許容されます (属性が多すぎるクラスの場合、ほとんどの衝突を回避するのに十分ないくつかの属性のみをハッシュする必要があります)。__key()
クラスごとにメソッドを手動で記述することを避けることはできますか?
__key()
、__eq__
、を定義する基本クラスを作成するのは良い考え__hash__
でしょうか? 特に、入力する必要があるすべてのインスタンス属性を見つけることができるかどうか__hash__
はわかりません。これは一般的に不可能であることはわかっていますが、この場合、オブジェクトについてより多くのことを想定できます (たとえば、オブジェクトは不変__init__
です - 終了後、その属性はすべてハッシュ可能など)。
(継承階層が機能しない場合は、おそらくデコレータで機能しますか?)