docsは、__hash__
メソッドと__eq__
メソッドを定義する限り、クラスはハッシュ可能であると言います。しかし:X
は非ハッシュになり何ユーザー定義クラスをハッシュできないものにするには?
class X(list):
# read-only interface of `tuple` and `list` should be the same, so reuse tuple.__hash__
__hash__ = tuple.__hash__
x1 = X()
s = {x1} # TypeError: unhashable type: 'X'
?
同じ値にハッシュするのは同じリスト(通常の等価関係)を持つ必要があります。そうでなければ、私は、ハッシュ関数にviolate this requirement意志:
唯一の必須プロパティが等しい比較オブジェクトが持っていることであるが
は、ドキュメントがハッシュ可能オブジェクトが変更されるべきではないことを警告しない同一のハッシュ値その生涯の間に、もちろん私は作成後にX
のインスタンスを変更しません。もちろん、通訳はそれをチェックしません。
うん、読み取り専用のインターフェイスが同じであるが、なぜあなたはそれだけの独自の外部インタフェースを使用するタプル.__ hash__を期待していますクラス?特にC言語で書かれている場合は、外部インタフェースを使用する方がはるかに遅くなります。クラスBがクラスAからサブクラス化されていない限り、クラスAのメソッドがクラスBのために機能することは、合理的に期待できません。x1 .__ hash __()を呼び出そうとしましたか? –
@LennartRegebroはい、私は同意します... http://stackoverflow.com/a/10254636/336527の私の最後のコメントを参照してください...私はちょうど脳の凍結していた。 – max