2017-01-30 2 views
3

私は、キーが1-1のときに単純なマッピングクラスを作成しようとしています。 key1:key2, key2:key1。私はクラスが私が入力した値と等しいかどうかをチェックするときにエラーに遭遇しています、私はTrueを得ているはずですが、私はFalseを得続けます。ディクテーションクラスの "マッピング"エラー

>>> m=Mapping() 
>>> m[2]=3 
>>> m 
Mapping({2: 3, 3: 2}) 
>>> m==Mapping({2: 3, 3: 2}) 
False 

私が間違っていることがわかりません。私のコードは以下のとおりです。ご了承ください。

class Mapping(): 
    def __init__(self, dic={}): 
     self.Dict = dict(dic) 
    def __repr__(self): 
     return "Mapping({})".format(self.Dict) 
    def __getitem__(self, loc=0): 
     return self.Dict[loc] 
    def pop(self, popn=0): 
     popm = self.Dict[popn] 
     self.Dict.pop(popn, None) 
     self.Dict.pop(popm, None) 
    def __setitem__(self, x, y): 
     self.Dict[x]=y 
     self.Dict[y]=x 
+9

'__eq__'の実装は役に立ちます... –

+0

私は基本的なdictの機能に違いは見られません。 '__eq__'の魔方法を定義すると助けになりますが、なぜ辞書に基づいて辞書を再実装しようとしていますか? –

+1

@NikolayProkopyev彼のdictは自動的に逆マッピングを提供します。 – Max

答えて

6

あなたMappingクラスは==が正しく動作するためには__eq__マジックメソッドを実装する必要があります。 Dictが等しい場合2 Mappingsが等しいと仮定すると、あなたはこのようsomehtingを試すことができます。これがなければ

def __eq__(self, other): 
     if isinstance(other, Mapping): 
      return self.Dict == other.Dict 
     return False 

==をそれらがisが何をするか、すなわち同じインスタンスを、あるかどうかを確認するにフォールバックします。


多くの場合、あなたは__eq__を実装するとき、あなたはまた__hash__メソッドを実装しますので、2つが一致しています。あなたは、例えば可能性、__hash__なし

def __hash__(self): 
     return hash(frozenset(self.Dict.items())) 

:ここでも、あなたは単にハッシュのためself.Dictに委任することができますが、dictはハッシュ可能ではありません(もっともな理由のために、下記を参照)がありますが、アイテムをハッシュ可能性Mappingクラスを別の辞書の中のキーとして使用しないでください。ただし、dictが変更可能であるため、この設定は問題があります。したがって、hash(m)が使用の間に変更され、dictまたはsetから後でMappingを取得できなくなる可能性があります。

+1

この場合も '__hash__'を実装するべきでしょうか? – Tagc

+0

@tobias_k、なぜ '__hash__'が必要なのか説明できますか? –

+2

@NikolayProkopyev私の編集を参照してください。しかし、この特定のケースでは、 '' __hash__'を実装することは実際には "通常の"変更可能な 'dict'のようには意味がありません。 –

関連する問題