Python 2.x a deux façons de surcharger les opérateurs de comparaison, __cmp__
ou les «opérateurs de comparaison riches» tels que __lt__
. On dit que les surcharges de comparaison riches sont préférées, mais pourquoi en est-il ainsi?
Les opérateurs de comparaison riches sont plus simples à implémenter chacun, mais vous devez en implémenter plusieurs avec une logique presque identique. Cependant, si vous pouvez utiliser l'ordre intégré cmp
et le tri des tuples , cela __cmp__
devient assez simple et remplit toutes les comparaisons:
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))
Cette simplicité semble mieux répondre à mes besoins que de surcharger les 6 (!) Des comparaisons riches. (Cependant, vous pouvez le ramener à «juste» 4 si vous vous fiez à «l'argument permuté» / comportement reflété, mais cela entraîne une augmentation nette de la complication, à mon humble avis.)
Y a-t-il des écueils imprévus dont je dois être informé si je ne fais que surcharger __cmp__
?
Je comprends la <
, <=
, ==
, etc. opérateurs peuvent être surchargées à d' autres fins, et peut retourner tout objet qu'ils aiment. Je ne m'interroge pas sur les mérites de cette approche, mais seulement sur les différences lors de l'utilisation de ces opérateurs pour des comparaisons dans le même sens qu'ils signifient pour les nombres.
Mise à jour: comme l'a souligné Christopher , cmp
disparaît dans 3.x. Existe-t-il des alternatives qui facilitent la mise en œuvre des comparaisons __cmp__
?