Ghi đè Python __eq__

Từ điển và Bộ là một số cấu trúc dữ liệu phổ biến nhất, được sử dụng nhiều cho thời gian tra cứu

Is never_equal in a set of itself? True
1 của chúng. Giao diện
Is never_equal in a set of itself? True
1 này được kích hoạt bởi các hàm băm có các thuộc tính sau

  • Nếu
    Is never_equal in a set of itself? True
    3 thì
    Is never_equal in a set of itself? True
    4
  • Nếu
    Is never_equal in a set of itself? True
    4, thì
    Is never_equal in a set of itself? True
    6 có thể bằng
    Is never_equal in a set of itself? True
    7
  • Nếu
    Is never_equal in a set of itself? True
    8, thì
    Is never_equal in a set of itself? True
    9

Từ điển và bộ, bất kể ngôn ngữ nào, sử dụng các giả định này để cho phép tra cứu nhanh

Is never_equal in a set of itself? True
1. Bài đăng này sẽ tập trung vào Python, nhưng các bài học được áp dụng bất kể ngôn ngữ nào

Tra từ điển nhanh

Từ điển Python khá tiên tiến và được tối ưu hóa — để biết chi tiết, hãy xem bài nói chuyện tuyệt vời này của Raymond Hettinger, nhưng để hiểu tại sao các thuộc tính này lại quan trọng, chúng ta sẽ tìm hiểu cách chúng hoạt động ở cấp độ cao

Lưu trữ một đối tượng

  1. Gọi
    Is never_equal in a set of itself? True
    6 trên khóa để tính giá trị băm của khóa. Nếu khóa không thể băm được, hãy tăng
    Is never_equal in a set of itself? True
    02
  2. Lưu trữ [hash_value, key, value] trong một mảng tại vị trí
    Is never_equal in a set of itself? True
    03
  3. Nếu mảng yêu cầu thay đổi kích thước, hãy sử dụng lại các
    Is never_equal in a set of itself? True
    04 đã tính toán trước đó để chèn lại tất cả các giá trị đã lưu trữ trước đó

Truy xuất một đối tượng bằng phím

  1. Gọi
    Is never_equal in a set of itself? True
    6 trên khóa để tính giá trị băm của khóa. Nếu khóa không thể băm được, hãy tăng
    Is never_equal in a set of itself? True
    02
  2. Tìm trong
    Is never_equal in a set of itself? True
    07 để biết mục nhập có
    Is never_equal in a set of itself? True
    04 phù hợp. Nếu một tồn tại - hãy kiểm tra sự bằng nhau, trước tiên bằng danh tính, sau đó bằng cách gọi
    Is never_equal in a set of itself? True
    0

Để có từ điển chính xác về chức năng, một số điều sau đây

  1. Is never_equal in a set of itself? True
    0 và
    Is never_equal in a set of itself? True
    6 phải đồng ý - các đối tượng bằng nhau phải có giá trị băm bằng nhau
  2. Is never_equal in a set of itself? True
    6 không bao giờ được thay đổi. Băm của một đối tượng không bao giờ được tính toán lại sau khi nó được chèn vào
  3. Các đối tượng thực hiện đẳng thức logic [e. g. thực hiện
    Is never_equal in a set of itself? True
    0] phải là bất biến để có thể băm được. Nếu một đối tượng có đẳng thức logic, việc cập nhật đối tượng đó sẽ thay đổi hàm băm của nó, vi phạm quy tắc 2.
    Is never_equal in a set of itself? True
    94,
    Is never_equal in a set of itself? True
    95,
    Is never_equal in a set of itself? True
    96 vốn dĩ có thể thay đổi và do đó không thể băm được.
    Is never_equal in a set of itself? True
    97,
    Is never_equal in a set of itself? True
    98,
    Is never_equal in a set of itself? True
    99 và
    Is never_equal in a set of itself? True
    50 là bất biến và do đó có thể băm
Đi sâu vào chi tiết

Trước tiên, hãy đi sâu vào cách các đối tượng hoạt động nếu chúng ta không triển khai

Is never_equal in a set of itself? True
6 và
Is never_equal in a set of itself? True
0

Theo mặc định, đẳng thức và giá trị băm dựa trên danh tính của một đối tượng. Việc triển khai hiện tại là

Is never_equal in a set of itself? True
53 [chúng ta không bao giờ nên dựa vào chi tiết triển khai này]

Is never_equal in a set of itself? True
8

Các bộ từ điển và bộ giả định rằng nếu một đối tượng có danh tính tương đương với một đối tượng trong

Is never_equal in a set of itself? True
96 hoặc
Is never_equal in a set of itself? True
94 thì các đối tượng đó bằng nhau [e. g. chúng ta giả sử một đối tượng luôn bằng chính nó]. Đây là một tối ưu hóa quan trọng vì các hàm
Is never_equal in a set of itself? True
0 có thể tốn kém

Is never_equal in a set of itself? True

Is never_equal in a set of itself? True
6 chỉ được gọi một lần khi một đối tượng được chèn vào một
Is never_equal in a set of itself? True
94 hoặc một
Is never_equal in a set of itself? True
96. Lưu ý rằng chúng tôi không bao giờ thấy hàm băm cho
Is never_equal in a set of itself? True
6 hoặc
Is never_equal in a set of itself? True
7 được gọi lại mặc dù chúng tôi đã buộc tập hợp phải thay đổi kích thước bằng cách chèn thêm 10.000 mục và chúng tôi đã truy xuất một đối tượng giống hệt nhau về mặt logic

Is never_equal in a set of itself? True
0

Đây là lý do tại sao điều cực kỳ quan trọng là

Is never_equal in a set of itself? True
6 của một đối tượng không bao giờ thay đổi trong suốt vòng đời của nó. Điều này hoạt động ngoài cổng để nhận dạng đối tượng [nếu
Is never_equal in a set of itself? True
83 chúng tôi biết
Is never_equal in a set of itself? True
3]

Nếu

Is never_equal in a set of itself? True
6 thay đổi, chúng ta có thể rơi vào tình huống từ điển và bộ từ điển không còn hoạt động và có những lỗi cực kỳ khó tìm

Is never_equal in a set of itself? True
9

Càng xa càng tốt. Chúng tôi đã vượt qua Python và thực sự buộc từ điển mà nó không muốn băm trở thành có thể băm được. Nhưng điều gì sẽ xảy ra nếu chúng ta biến đổi

Is never_equal in a set of itself? True
86 - từ điển cơ bản

Is never_equal in a set of itself? True
5

Cái gì?

Nhớ lại - tất cả các tối ưu hóa cho phép từ điển và bộ trở nên siêu nhanh với tra cứu

Is never_equal in a set of itself? True
1 yêu cầu hàm băm để không bao giờ thay đổi. Bằng cách chống lại ngôn ngữ, chúng tôi đã tạo cơ hội cho những lỗi thực sự tinh vi, khó hiểu

OK, tôi hiểu rồi, thay vào đó tôi nên làm gì?

Tôi rất vui vì bạn đã hỏi. Nếu chúng tôi thực sự muốn các đối tượng này có thể băm được, chúng tôi có thể đạt được điều này với tính bất biến

Có một số tiện ích tích hợp mà chúng tôi có thể tận dụng, cụ thể là

Is never_equal in a set of itself? True
50 và
Is never_equal in a set of itself? True
99 và một số thư viện bên thứ ba mà chúng tôi có thể sử dụng -
Is never_equal in a set of itself? True
71 và
Is never_equal in a set of itself? True
72. Mặc dù cả hai đều là thư viện của bên thứ ba, cả hai đều có các điểm tương tự mạnh trong thư viện chuẩn Python [bất biến có thể là một phần của thư viện chuẩn trong 3. 9 vì nó được sử dụng như một phần của asyncio contextvars và attrs hầu hết được sao chép trong thư viện chuẩn với
Is never_equal in a set of itself? True
73

nội trang

Nếu chúng tôi có một

Is never_equal in a set of itself? True
95 mà chúng tôi muốn băm, chúng tôi có thể chuyển đổi nó thành một
Is never_equal in a set of itself? True
50 để đảm bảo nó không thay đổi

Is never_equal in a set of itself? True
8

Nếu chúng tôi có một

Is never_equal in a set of itself? True
96 mà chúng tôi muốn băm, chúng tôi có thể chuyển đổi nó thành một
Is never_equal in a set of itself? True
99 để đảm bảo nó không thay đổi trong khi vẫn duy trì tra cứu O[1]

Is never_equal in a set of itself? True
7

Lớp học và từ điển

Chúng tôi sẽ sử dụng hai thư viện bên thứ ba chất lượng cao,

Is never_equal in a set of itself? True
78 và
Is never_equal in a set of itself? True
79

Is never_equal in a set of itself? True
72 hỗ trợ các đối tượng
Is never_equal in a set of itself? True
91 có thể được coi là bất biến và do đó có thể băm được. Là điểm thưởng, nó sẽ loại bỏ rất nhiều mã nồi hơi

Is never_equal in a set of itself? True
9

Đối với

Is never_equal in a set of itself? True
94, chúng tôi sẽ sử dụng
Is never_equal in a set of itself? True
93.
Is never_equal in a set of itself? True
93 là một Bản đồ bất biến và do đó có thể Hashable. Mọi đột biến đều tạo ra một bản đồ mới cùng nhau, nhưng không thay đổi bản đồ bên dưới. Đó là hiệu suất cao hơn đáng kể so với
Is never_equal in a set of itself? True
95

Is never_equal in a set of itself? True
5Kết luận

Chống lại ngôn ngữ để cố gắng buộc các đối tượng có thể băm được vừa chậm vừa không an toàn — lãng phí tiền bạc, ảnh hưởng đến thời gian phản hồi và làm giảm độ tin cậy. Chúng tôi đã xem xét một số công cụ bạn có thể sử dụng ở đây để làm cho các đối tượng có thể băm được khi bạn cần trong khi vẫn duy trì tính chính xác và hiệu suất. Chúng tôi đã sử dụng Python làm ví dụ ở đây, những vấn đề và hợp đồng này không giới hạn ở Python - chúng là nền tảng cho cách các cấu trúc dữ liệu như bản đồ băm hoặc bộ băm hoạt động. Bài đăng trên blog này cũng có sẵn dưới dạng sổ ghi chép Jupyter mà bạn có thể tải xuống và tự chơi với các ví dụ

Nếu bạn thấy mình đang đấu tranh chống lại ngôn ngữ đó, hãy dừng lại và suy nghĩ xem đây có thực sự là điều đúng đắn cần làm hay không.

Nếu bạn muốn tham gia nhóm tại Lyft, chúng tôi đang tuyển dụng. Vui lòng kiểm tra trang nghề nghiệp của chúng tôi để biết thêm thông tin

Python có đang được sử dụng không __ eq __?

Python gọi nội bộ x. __eq__[y] để so sánh hai đối tượng sử dụng x == y . Nếu phương thức __eq__[] không được xác định, Python sẽ sử dụng toán tử is theo mặc định để kiểm tra hai đối tượng tùy ý xem chúng có nằm trên cùng một địa chỉ bộ nhớ hay không.

Mục đích của hàm __ eq __ là gì?

Chà, đó là những gì chúng ta sẽ tự xác định bằng cách triển khai một phương thức có tên là __eq__. Đây là một trong những phương thức dunder trong Python. Nó cho phép chúng ta ghi đè chức năng cơ bản của toán tử “==” trong Python .

Có thể ghi đè == không?

Ghi chú thuật ngữ. == không bao giờ bị ghi đè . Nó quá tải.

__ chứa __ trong Python là gì?

Chuỗi Python __contains__[] là một phương thức thể hiện và trả về giá trị boolean Đúng hoặc Sai tùy thuộc vào việc đối tượng chuỗi có chứa đối tượng chuỗi đã chỉ định hay không. Note that the Python string contains[] method is case sensitive.

Chủ Đề