2

のサブクラスであるクラスがありtupleます。そのクラスのインスタンスを a の要素として使用したいのですsetが、ハッシュできない型であるというエラーが表示されます。__eq__これは、 and__ne__メソッドをオーバーライドしたためだと思います。型のハッシュ可能性を復元するにはどうすればよいですか? Python 3.2 を使用しています。

4

2 に答える 2

3

等しいと比較されるオブジェクトは、同じハッシュ値を持つ必要があります

したがって、同等性を比較するために使用しているプロパティに基づいてハッシュを作成することをお勧めします

エイドリアンの例は、このようにより良いでしょう

class test(tuple):
    def __eq__(self,comp):
        return self[0] == comp[0]
    def __ne__(self,comp):
        return self[0] != comp[0]
    def __hash__(self):
        return hash((self[0],))

平等のために気にかけているものを含むタプルのハッシュを活用するだけです

于 2012-10-06T10:47:03.297 に答える
2

タイプをハッシュ可能にする必要があります。これは__hash__()、タプルから派生するクラスにメンバー関数を実装することを意味します。

例えば:

class test(tuple):
    def __eq__(self,comp):
        return self[0] == comp[0]
    def __ne__(self,comp):
        return self[0] != comp[0]
    def __hash__(self):
        return hash(self[0])

そして、これは今のように見えます:

>>> set([test([1,]),test([2,]),test([3,])])
{(1,), (2,), (3,)}
>>> hash(test([1,]))
1

注:__hash__()比較演算子とハッシュ計算の関係を理解するには、関数のドキュメントを必ず読む必要があります。

于 2012-10-06T09:48:03.617 に答える