2013-04-26 28 views
9

Trong Python3, functools.total_ordering decorator cho phép một chỉ quá tải __lt____eq__ để có được tất cả 6 toán tử so sánh.python total_ordering: tại sao __lt__ và __eq__ thay vì __le__?

Tôi không hiểu tại sao người ta phải viết hai nhà khai thác khi người ta sẽ là đủ, cụ thể là __le__ hoặc __ge__, và tất cả những người khác sẽ được xác định phù hợp:

a < b <=> not (b <= a) 
a > b <=> not (a <= b) 
a == b <=> (a <= b) and (b <= a) 
a != b <=> (a <= b) xor (b <= a) 

Có phải đó là chỉ vì hành xor không tồn tại tự nhiên?

+2

'xor' không tồn tại nguyên bản. –

+0

@MartijnPieters chỉ bitmap xor, phải không? –

Trả lời

13

Các tài liệu khẳng định bạn phải xác định một trong những __lt__(), __le__(), __gt__(), hoặc __ge__(), nhưng chỉ nên cung cấp một phương pháp __eq__().

Nói cách khác, phương pháp __eq__tùy chọn.

total_ordering implementation không yêu cầu bạn chỉ định phương thức __eq__; nó chỉ kiểm tra các phương pháp __lt__(), __le__(), __gt__() hoặc __ge__(). Nó cung cấp tối đa 3 phương pháp đặc biệt bị thiếu dựa trên một trong số đó 4.

Phương pháp __eq__ là tùy chọn vì đối tượng cơ sở object xác định một đối tượng cho bạn; hai trường hợp được coi là bằng nhau chỉ khi chúng là cùng một đối tượng; ob1 == ob2 chỉ khi ob1 is ob2True. Xem do_richcompare() function in object.c; hãy nhớ rằng toán tử == trong mã có so sánh con trỏ.

+0

Tôi tưởng tượng nó là bởi vì sự bình đẳng có xu hướng được sử dụng rất nhiều, nó có ý nghĩa để thực hiện nó bằng tay. –

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