Các ví dụ mô hình hóa dữ liệu Python (phần 4)

Sự bằng và phương thức __eq__

Bằng là một dạng khác của mối quan hệ từ các dạng khác của so sánh. Không phải tất cả các objects là so sánh được
sử dụng nhỏ hơn hoặc lớn hơn, nhưng bất cứ 2 objects nào có thể được so sánh cho bằng hoặc không bằng. Ví dụ, khi
biến twoThirds tham chiếu đến một số hữu tỷ, nó không có nghĩa để nói twoThirds < “hi there”, nhưng nó có nghĩa
để nói twoThirds != “hi there” (true, chúng không giống nhau). Đặt vào cách thức khác, biểu thức đầu tiên nên khởi
tạo một lỗi ngữ nghĩa, trong khi biểu thức thứ 2 nên trả về True.
Trình dịch Python nhặt ra sự bằng từ so sánh khác bằng cách tìm kiếm cho phương thức __eq__ khi nó chạm trán các
toán tử == và !=. Khi bạn nhớ lại trong các học phần trước, Python bao gồm một thực thi của phương thức này cho
các objects như các lists và dictionaries cũng như các dạng số. Tuy nhiên, trừ phi bạn bao gồm một thực thi
của phương thức này cho một class mới, Python dựa vào thực thi của __eq__ trong class object, cái sử dụng toán
tử is. Thực thi này trả về True chỉ nếu 2 toán hạng tham chiếu đến chính xác cùng object (đồng dạng object). Tiêu
chí này của bằng là quá hẹp cho nhiều objects, như các số hữu tỷ, nơi bạn có thể muốn 2 objects khác biệt cái
trình bày cùng số sẽ được xem là bằng nhau.
code 1
Chú ý rằng phương thức trước tiên test 2 toán hạng cho đồng dạng object sử dụng toán tử is của Python. Toán tử
is trả về True nếu self và other tham chiếu đến chính xác cùng object. Nếu 2 objects là khác biệt, phương thức sau
đó sử dụng hàm type của Python để quyết định liệu có hay không là chúng cùng dạng. Nếu chúng không cùng dạng, chúng
không thể bằng. Cuối cùng, nếu 2 toán hạng là cùng dạng, cái thứ hai phải là một số hữu tỷ, nên nó là an toàn
để truy cập các bộ phận của cả 2 toán hạng để so sánh chúng cho bằng trong lựa chọn cuối.
Như một quy tắc ngon tay cái, bạn nên bao gồm một phương thức __eq__ trong bất cứ class nào nơi một so sánh
cho bằng sử dụng một tiêu chí hơn là đồng dạng object. Bạn cũng nên bao gồm các phương thức so sánh cho < và >=
khi các objects là so sánh được sử dụng nhỏ hơn hoặc lớn hơn.

Chia sẻ