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__
หรือไม่?