Python 2.x có hai cách để nạp chồng 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 hơn, nhưng tại sao điều này lại như vậy?
Các toán tử so sánh phong phú đơn giản hơn để triển khai mỗi toán tử, nhưng bạn phải triển khai một số trong số chúng với logic gần giống nhau. Tuy nhiên, nếu bạn có thể sử dụng thứ tự nội trang cmp
và tuple, thì việc này __cmp__
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))
Sự đơ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 việc quá tải tất cả 6 (!) Của các so sánh phong phú. (Tuy nhiên, bạn có thể hạ nó xuống "chỉ" 4 nếu bạn dựa vào "đối số được hoán đổi" / hành vi được phản ánh, nhưng điều đó dẫn đến sự gia tăng phức tạp, theo ý kiến khiêm tốn của tôi.)
Có bất kỳ cạm bẫy nào không lường trước được mà tôi cần lưu ý nếu tôi chỉ quá tải __cmp__
không?
Tôi hiểu <
, <=
, ==
vv khai thác có thể bị quá tải cho các mục đích khác, và có thể trả lại bất kỳ đối tượng họ như thế nào. Tôi không hỏi về giá trị của cách tiếp cận đó, mà chỉ hỏi về sự khác biệt khi sử dụng các toán tử này để so sánh theo cùng nghĩa mà chúng có nghĩa đối với các số.
Cập nhật: Như Christopher đã chỉ ra , cmp
sẽ biến mất trong 3.x. Có bất kỳ lựa chọn thay thế nào giúp việc thực hiện so sánh dễ dàng như ở trên __cmp__
không?