Эквивалент Python сравнения Java ()

Я выполняю проект в Python (3.2), для которого мне нужно сравнивать объекты, определенные пользователем. Я использую OOP в Java, где можно определить метод compareTo() в классе, который задает естественный порядок этого класса, как в примере ниже:

 public class Foo { int a, b; public Foo(int aa, int bb) { a = aa; b = bb; } public int compareTo(Foo that) { // return a negative number if this < that // return 0 if this == that // return a positive number if this > that if (this.a == that.a) return this.b - that.b; else return this.a - that.a; } } 

Я довольно новичок в классах / объектах в Python, поэтому я хотел бы знать, что такое «питонический» способ определения естественного упорядочения класса?

Вы можете реализовать специальные методы __lt__ , __gt__ и т. Д. Для реализации операторов по умолчанию для настраиваемых типов. Узнайте больше о них в языковой ссылке .

Например:

 class Foo: def __init__ (self, a, b): self.a = a self.b = b def __lt__ (self, other): if self.a == other.a: return self.b < other.b return self.a < other.b def __gt__ (self, other): return other.__lt__(self) def __eq__ (self, other): return self.a == other.b and self.b == other.b def __ne__ (self, other): return not self.__eq__(other) 

Или, как сказано stranac в комментариях, вы можете использовать декоратор total_ordering чтобы сохранить некоторую типизацию:

 @functools.total_ordering class Foo: def __init__ (self, a, b): self.a = a self.b = b def __lt__ (self, other): if self.a == other.a: return self.b < other.b return self.a < other.b def __eq__ (self, other): return self.a == other.b and self.b == other.b 

Python имеет аналогичную функцию: __cmp__() .

Теперь я вижу, что вы спрашиваете о Python 3. Их «что нового» предлагает :

 Функция cmp () следует рассматривать как ушедшую, а специальный метод __cmp __ () 
 больше не поддерживается.  Для сортировки используйте __lt __ (), __eq __ () с __hash __ () и 
 другие богатые сравнения по мере необходимости.  (Если вам действительно нужна функция cmp () 
 вы можете использовать выражение (a> b) - (a <b) как эквивалент для cmp (a, b).)

Так что, похоже, вы всегда можете сделать что-то вроде

 def compareTo(self, that): return ((self > that) - (self < that)) 

или

 @classmethod def compare(cls, a, b): return ((a > b) - (a < b)) 

после реализации __gt__() и __lt__() .

Который вы тогда использовали бы как:

 f1 = Foo(1,1) f2 = Foo(2,2) f1.compareTo(f2) Foo.compare(f1,f2) 

Это даст вам эквивалентную функциональность.