O Python 2.x possui duas maneiras de sobrecarregar os operadores de comparação __cmp__
ou os "operadores de comparação avançados", como __lt__
. Diz-se que as sobrecargas de comparação avançada são as preferidas, mas por que isso acontece?
Os operadores de comparação avançados são mais simples de implementar cada um, mas você deve implementar vários deles com lógica quase idêntica. No entanto, se você pode usar a cmp
ordenação interna e de tupla, __cmp__
torna - se bastante simples e preenche todas as comparações:
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))
Essa simplicidade parece atender às minhas necessidades muito melhor do que sobrecarregar todas as 6 (!) Comparações ricas. (No entanto, você pode baixá-lo para "apenas" 4 se confiar no "argumento trocado" / comportamento refletido, mas isso resulta em um aumento líquido de complicações, na minha humilde opinião.)
Existem armadilhas imprevistas das quais preciso estar ciente se apenas sobrecarregar __cmp__
?
Eu entendo a <
, <=
, ==
, etc. operadores podem ser sobrecarregados para outros fins, e pode retornar qualquer objeto que eles gostam. Não estou perguntando sobre os méritos dessa abordagem, mas apenas sobre as diferenças ao usar esses operadores para comparações no mesmo sentido que significam para números.
Atualização: Como Christopher apontou , cmp
está desaparecendo no 3.x. Existem alternativas que tornam a implementação de comparações tão fácil quanto as anteriores __cmp__
?