Можно ли просто реализовать __lt__ для класса, который будет отсортирован?

Предположим, что экземпляры моего ClassA окажутся в структуре данных, и мы знаем, что на нем будет вызываться sorted(). Это кто-то еще код, который вызовет sorted(), поэтому я не могу указать функцию сортировки, но я могу реализовать любые методы, подходящие для ClassA.

Мне кажется, что

def __lt__(self, other):

является достаточным и что мне не нужно реализовывать другие пять или около того методов (qt, eq, le, ge, ne).

Достаточно ли этого?

Ответ 1

PEP 8 рекомендует против этой практики. Я также рекомендую против него, потому что это хрупкий стиль программирования (не устойчивый к незначительным модификациям кода):

Вместо этого рассмотрите использование декоратора класса functools.total_ordering, чтобы выполнить работу:

@total_ordering
class Student:
    def __eq__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) ==
                (other.lastname.lower(), other.firstname.lower()))
    def __lt__(self, other):
        return ((self.lastname.lower(), self.firstname.lower()) <
                (other.lastname.lower(), other.firstname.lower()))