2010-03-28 25 views
25

Tôi có một danh sách các đối tượng mà tôi muốn chuyển thành một tập. Đối tượng của tôi chứa một vài lĩnh vực mà một số trong đó là o.ido.area. Tôi muốn hai vật thể bằng nhau nếu hai trường này giống nhau. ví dụ: o1==o2 khi và chỉ khi o1.area==o2.area and o1.id==o2.id.Python: Làm thế nào để bộ làm việc

Tôi đã cố gắng viết quá __eq____cmp__ nhưng tôi gặp lỗi: TypeError: unhashable instance.

nên tôi ghi đè gì?

+3

http://docs.python.org/library/stdtypes.html#set-types-set-frozenset và http://docs.python.org/glossary.html#term-hashable –

Trả lời

38

Xác định __hash__ phương pháp để trả lại một băm có ý nghĩa dựa trên các lĩnh vực id và khu vực. Ví dụ:

def __hash__(self): 
    return hash(self.id)^hash(self.area) 
+13

Tôi là một chút leery của bitwise toán học về một cái gì đó như thế. Tôi muốn sử dụng một cái gì đó như = return hash ((self.id, self.area)) =. –

+1

Điều này có thể là một vấn đề khi băm thành phần tương tự. Ví dụ băm (x)^băm (y) sẽ misbehave nếu tọa độ ghép với trục hoán đổi là phổ biến. Trong trường hợp này, rất khó có thể gây ra vấn đề vì không thể tạo int và chuỗi có băm tương ứng. Có nói rằng, đề nghị của bạn vẫn là một tốt, mà tôi muốn tôi nghĩ đến :-). –

9

"TypeError: unashable instance". lỗi có lẽ là do kiểu cũ định nghĩa lớp tức là .:

class A: 
    pass 

Sử dụng phong cách mới thay vì:

class A(object): 
    pass 

Nếu bạn ghi đè __cmp__ chức năng bạn nên override __hash__ cho việc sử dụng đối tượng của bạn trong bộ. Trong trường hợp hash khác xem xét tất cả các cá thể đối tượng là hàm unequal và __cmp__ sẽ không bao giờ được gọi.

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