2011-12-30 33 views
10

Nếu tôi có danh sách đối tượng, tôi có thể sử dụng phương pháp __cmp__ để ghi đè đối tượng. Điều này ảnh hưởng đến cách hoạt động của toán tử == và chức năng item in list. Tuy nhiên, nó dường như không ảnh hưởng đến chức năng item in set - Tôi tự hỏi làm thế nào tôi có thể thay đổi đối tượng MyClass để tôi có thể ghi đè lên hành vi cách tập hợp so sánh các mục.Trong python - toán tử dùng để kiểm tra nếu đối tượng nằm trong tập hợp

Ví dụ, tôi muốn tạo một đối tượng trả về True trong ba câu lệnh in ở dưới cùng. Tại thời điểm này, lệnh in cuối cùng trả về Sai.

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 

Trả lời

9

set sử dụng __hash__ để so sánh. Ghi đè điều đó và bạn sẽ tốt:

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

Điều này là do thực thi 'set' sử dụng từ điển để lưu trữ (nơi tất cả giá trị bị bỏ qua) và từ điển chứa hoạt động (' key in dict_') sử dụng băm của 'khóa'. – Noah

Các vấn đề liên quan