2011-12-30 1 views
10

オブジェクトのリストがある場合、オブジェクトを比較するために__cmp__メソッドを使用できます。これは、==演算子がどのように動作するか、およびitem in list関数に影響します。しかし、それはitem in set関数には影響しないようです - 私はMyClassオブジェクトをどのように変更して、セットが項目を比較するかの振る舞いをオーバーライドすることができるのだろうかと思っています。python - オブジェクトがセット内にあるかどうかをテストするためにセットが使用する演算子

たとえば、下の3つのprintステートメントでTrueを返すオブジェクトを作成したいとします。現時点では、最後のprintステートメントはFalseを返します。

class MyClass(object): 
    def __init__(self, s): 
     self.s = s 
    def __cmp__(self, other): 
     return cmp(self.s, other.s) 

instance1, instance2 = MyClass("a"), MyClass("a") 

print instance2==instance1    # True 
print instance2 in [instance1]   # True 
print instance2 in set([instance1]) # False 

答えて

9

set比較のため__hash__を使用しています。それをオーバーライドし、あなたは良いでしょう:

class MyClass(object): 
    def __init__(self, s): 
     self.s = s 
    def __cmp__(self, other): 
     return cmp(self.s, other.s) 
    def __hash__(self): 
     return hash(self.s) # Use default hash for 'self.s' 

instance1, instance2 = MyClass("a"), MyClass("a") 
instance3 = MyClass("b") 

print instance2==instance1    # True 
print instance2 in [instance1]   # True 
print instance2 in set([instance1]) # True 
+0

'set'実装が(値はすべて無視されます)ストレージ用の辞書を使用して辞書を操作(' dict_'でキー)の使用が含まれているためですキーのハッシュ – Noah

関連する問題