Python 2.x มีสองวิธีในการโอเวอร์โหลดตัวดำเนินการเปรียบเทียบ__cmp__หรือ "ตัวดำเนินการเปรียบเทียบที่สมบูรณ์" เช่น__lt__. การเปรียบเทียบที่มากเกินไปนั้นเป็นที่ต้องการ แต่เหตุใดจึงเป็นเช่นนั้น
ตัวดำเนินการเปรียบเทียบแบบ Rich นั้นง่ายกว่าในการใช้งานแต่ละตัว แต่คุณต้องใช้ตัวดำเนินการหลายตัวด้วยตรรกะที่เหมือนกัน อย่างไรก็ตามหากคุณสามารถใช้การcmpสั่งซื้อในตัวและทูเพิล__cmp__ได้ก็จะค่อนข้างง่ายและตอบสนองการเปรียบเทียบทั้งหมด:
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))
ความเรียบง่ายนี้ดูเหมือนจะตอบสนองความต้องการของฉันได้ดีกว่าการใช้การเปรียบเทียบที่สมบูรณ์ทั้ง 6 (!) มากเกินไป (อย่างไรก็ตามคุณสามารถลงไปที่ "แค่" 4 ได้หากคุณอาศัย "การโต้แย้งที่สลับ" / พฤติกรรมที่สะท้อนกลับ แต่นั่นส่งผลให้เกิดความซับซ้อนเพิ่มขึ้นสุทธิในความเห็นที่ต่ำต้อยของฉัน)
มีข้อผิดพลาดที่ไม่คาดฝันใด ๆ ที่ฉันต้องระวังหากฉันทำงานหนักเกินไป__cmp__หรือไม่?
ฉันเข้าใจ<, <=, ==ฯลฯ ประกอบการสามารถจะมากเกินไปเพื่อวัตถุประสงค์อื่น ๆ และสามารถกลับวัตถุใด ๆ ที่พวกเขาต้องการ ฉันไม่ได้ถามถึงข้อดีของแนวทางนั้น แต่เกี่ยวกับความแตกต่างเมื่อใช้ตัวดำเนินการเหล่านี้เพื่อการเปรียบเทียบในแง่เดียวกับที่พวกเขาหมายถึงตัวเลข
อัปเดต:ตามที่คริสโตเฟอร์ชี้ให้เห็นว่าcmpหายไปใน 3.x มีทางเลือกอื่นที่ทำให้การเปรียบเทียบใช้งานง่ายเหมือนข้างต้น__cmp__หรือไม่?