2017-07-18 10 views
-1

python documentationには、__eq__をオーバーライドし、オブジェクトが不変である場合、クラスが適切にハッシュ可能になるように、__hash__をオーバーライドする必要があることが記載されています。実際に__eq__と__hash__を実装するための推奨方法

、私はこれを行うとき、私は多くの場合、これは多少の繰り返しであり、その他が更新されたときに1を更新し忘れるの明確な危険性がある

class MyClass(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def __eq__(self, other): 
     if type(other) is type(self): 
      return (self.a == other.a) and (self.b == other.b) 
     else: 
      return False 

    def __hash__(self): 
     return hash((self.a, self.b)) 

のようなコードで終わります。

これらのメソッドを一緒に実装する推奨方法はありますか?

答えて

0

私自身の質問に答える。これを実行する1つの方法は、補助的な__members関数を定義し、それを__hash____eq__の定義に使用することです。この方法では、重複はありません:

class MyClass(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 

    def __members(self): 
     return (self.a, self.b) 

    def __eq__(self, other): 
     if type(other) is type(self): 
      return self.__members() == other.__members() 
     else: 
      return False 

    def __hash__(self): 
     return hash(self.__members()) 
関連する問題