docs nói rằng một lớp có thể băm miễn là nó xác định phương pháp __hash__
và phương pháp __eq__
. Tuy nhiên:Điều gì làm cho lớp do người dùng định nghĩa không thể thực hiện được?
class X(list):
# read-only interface of `tuple` and `list` should be the same, so reuse tuple.__hash__
__hash__ = tuple.__hash__
x1 = X()
s = {x1} # TypeError: unhashable type: 'X'
Điều gì làm cho X
không thể hoạt động?
Lưu ý rằng tôi phải có danh sách giống hệt nhau (về mặt bình đẳng) để được băm với cùng một giá trị; nếu không, tôi sẽ violate this requirement trên hàm băm:
Thuộc tính yêu cầu duy nhất là đối tượng mà so sánh tương đương có giá trị băm cùng
Các tài liệu làm cảnh báo rằng một đối tượng hashable không nên được sửa đổi trong suốt cuộc đời của nó, và tất nhiên tôi không sửa đổi các trường hợp của X
sau khi tạo. Tất nhiên, thông dịch viên sẽ không kiểm tra điều đó.
Yeah, các giao diện chỉ đọc là như nhau, nhưng tại sao bạn mong đợi tuple .__ hash__ để chỉ sử dụng các giao diện bên ngoài của riêng của nó lớp học? Đặc biệt khi viết bằng C. Sử dụng giao diện bên ngoài sẽ chậm hơn nhiều. Bạn không thể mong đợi một cách hợp lý một phương thức từ lớp A để làm việc cho lớp B trừ khi lớp B được phân lớp từ lớp A. Bạn thậm chí có cố gắng gọi x1 .__ hash __() xem liệu nó có hoạt động không? –
@LennartRegebro Có, tôi đồng ý ... Xem nhận xét cuối cùng của tôi cho http: //stackoverflow.com/a/10254636/336527 ... Tôi vừa bị đóng băng não. – max