Python 2.x tiene dos formas de sobrecargar los operadores de comparación, __cmp__
o los "operadores de comparación enriquecidos" como __lt__
. Se dice que se prefieren las abundantes sobrecargas de comparación, pero ¿por qué es así?
Los operadores de comparación ricos son más simples de implementar cada uno, pero debe implementar varios de ellos con una lógica casi idéntica. Sin embargo, si puede usar el orden integrado cmp
y de tuplas, entonces se __cmp__
vuelve bastante simple y cumple con todas las comparaciones:
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))
Esta simplicidad parece satisfacer mis necesidades mucho mejor que sobrecargar las 6 (!) De las ricas comparaciones. (Sin embargo, puede reducirlo a "solo" 4 si confía en el "argumento intercambiado" / comportamiento reflejado, pero eso da como resultado un aumento neto de complicaciones, en mi humilde opinión).
¿Hay problemas imprevistos de los que deba ser consciente si solo sobrecargo __cmp__
?
Entiendo la <
, <=
, ==
, etc. operadores pueden ser sobrecargados para otros fines, y puede devolver cualquier objeto que les gusta. No estoy preguntando sobre los méritos de ese enfoque, sino solo sobre las diferencias al usar estos operadores para comparaciones en el mismo sentido en que se refieren a los números.
Actualización: como señaló Christopher , cmp
está desapareciendo en 3.x. ¿Existen alternativas que faciliten la implementación de comparaciones como las anteriores __cmp__
?