Эквивалент 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, поэтому я хотел бы знать, что такое «питонический» способ определения естественного упорядочения класса?
- class ClassName и класс ClassName (объект)
- Python – имя метода печати при вызове методов класса
- дочерний класс python __set__ не работает
- Как программно добавлять экземпляры в Python?
- Понимание списка Python с использованием переменной класса выбрасывает NameError
Вы можете реализовать специальные методы __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)
Это даст вам эквивалентную функциональность.
- Как я могу динамически создавать методы класса для класса в python
- Самый быстрый способ в python для поиска объекта с определенным значением атрибута из списка?
- Как должна быть построена иерархия базового класса?
- Как создать экземпляр класса внутри этого метода класса?
- Как определить, что помещать внутри функции __init__ в класс python?
- эффективный способ доступа к значениям в кортеже (python)
- Методы одинакового имени и наследования, Python
- NameError: глобальное имя не определено
- Подклассы Python и назначение родительского значения