Python 2.x có hai cách để quá tải toán tử so sánh, __cmp__
hoặc "toán tử so sánh phong phú" chẳng hạn như __lt__
. Quá tải so sánh phong phú được cho là được ưu tiên, nhưng tại sao lại như vậy?__lt__ thay vì __cmp__
Các toán tử so sánh phong phú đơn giản hơn để thực hiện từng thao tác, nhưng bạn phải triển khai một vài trong số chúng với logic gần như giống hệt nhau. Tuy nhiên, nếu bạn có thể sử dụng được xây dựng trong cmp
và tuple đặt hàng, sau đó __cmp__
bị khá đơn giản và đáp ứng tất cả các so sánh:
class A(object):
def __init__(self, name, age, other):
self.name = name
self.age = age
self.other = other
def __cmp__(self, other):
assert isinstance(other, A) # assumption for this example
return cmp((self.name, self.age, self.other),
(other.name, other.age, other.other))
đơn giản này dường như để đáp ứng nhu cầu của tôi tốt hơn nhiều so với quá tải tất cả 6 của những người giàu (!) so sánh. (Tuy nhiên, bạn có thể nhận được nó xuống "chỉ" 4 nếu bạn dựa vào "hành vi hoán đổi"/phản ánh hành vi, nhưng điều đó dẫn đến sự gia tăng ròng của biến chứng, theo ý kiến khiêm tốn của tôi.)
Có bất kỳ những cạm bẫy không lường trước được Tôi cần phải được biết nếu tôi chỉ quá tải __cmp__
?
Tôi hiểu các nhân viên <
, <=
, ==
, v.v. có thể bị quá tải vì các mục đích khác và có thể trả lại bất kỳ đối tượng nào họ thích. Tôi không hỏi về giá trị của cách tiếp cận đó, nhưng chỉ về sự khác biệt khi sử dụng các toán tử này để so sánh theo cùng một nghĩa mà chúng có ý nghĩa đối với các con số.
Cập nhật: Vì Christopher pointed out, cmp
sẽ biến mất trong 3.x. Có bất kỳ lựa chọn thay thế nào thực hiện so sánh triển khai dễ dàng như trên __cmp__
không?
Xem câu trả lời của tôi, nhưng thực sự có thiết kế giúp mọi thứ trở nên dễ dàng hơn cho nhiều lớp bao gồm bạn (ngay bây giờ bạn cần mixin, metaclass hoặc trang trí lớp để áp dụng): __key__ phương thức đặc biệt có mặt, nó phải trả về một bộ các giá trị, và tất cả các bộ so sánh và __hash__ được định nghĩa theo các bộ tuple đó. Guido thích ý tưởng của tôi khi tôi giải thích nó cho anh ta, nhưng sau đó tôi đã bận rộn với những thứ khác và không bao giờ có xung quanh để viết một PEP ... có lẽ cho 3,2 ;-). Trong khi đó tôi tiếp tục sử dụng mixin của tôi cho điều đó! -) –