set(list_of_objects)
sẽ chỉ xóa các bản sao nếu bạn biết bản sao là gì, nghĩa là bạn sẽ cần xác định tính duy nhất của một đối tượng.
Để làm được điều đó, bạn sẽ cần phải làm cho đối tượng có thể băm được. Bạn cần xác định cả __hash__
và __eq__
, đây là cách thực hiện:
http://docs.python.org/glossary.html#term-hashable
Tuy nhiên, bạn có thể chỉ cần xác định __eq__
phương pháp.
CHỈNH SỬA :Cách triển khai __eq__
phương pháp:
Bạn sẽ cần biết, như tôi đã đề cập, định nghĩa về tính duy nhất của đối tượng của bạn. Giả sử chúng tôi có một Sách với các thuộc tính author_name và tên sách mà sự kết hợp của chúng là duy nhất, (vì vậy, chúng tôi có thể có nhiều sách do Stephen King là tác giả và nhiều sách có tên The Shining, nhưng chỉ có một sách có tên The Shining của Stephen King), thì việc triển khai như sau:
def __eq__(self, other):
return self.author_name==other.author_name\
and self.title==other.title
Tương tự, đây là cách tôi đôi khi triển khai __hash__
phương pháp:
def __hash__(self):
return hash(('title', self.title,
'author_name', self.author_name))
Bạn có thể kiểm tra xem nếu tạo danh sách 2 sách có cùng tác giả và tên sách, các đối tượng sách sẽ giống nhau (với bằng nhau (với is
toán tử) và ==
nhà điều hành). Ngoài ra, khi set()
được sử dụng, nó sẽ xóa một cuốn sách.
CHỈNH SỬA :Đây là một trình thử nghiệm cũ của tôi, nhưng bây giờ tôi mới nhận thấy rằng nó có lỗi được sửa bằng gạch ngang trong đoạn cuối:các đối tượng có cùng hash()
sẽ không cung cấp True
khi so sánh với is
. Tuy nhiên, tính năng hashability của đối tượng được sử dụng nếu bạn định sử dụng chúng làm phần tử của tập hợp hoặc làm khóa trong từ điển.