Python: сортировать пользовательский класс без использования аргумента `key`?

Вы можете отсортировать массив myclass с помощью аргумента key функции sorted:

sortedlist = sorted(myclasses, key=lambda obj: obj.myproperty)

Есть ли способ определить естественный порядок для нашего класса? Возможно, какой-то волшебный метод, чтобы мы не каждый раз проходили ключ?

например.

class myclass:
    def __init__(self,a,b):
        self.key1 = a
        self.key2 = b

    def __sortkey__(self):
        return self.key2

Или это будет естественно работать, если мы определим __le__ возможно?

Ответ 1

В дополнение к __cmp__ вы также можете сделать это с помощью так называемых "богатых операторов сравнения" __eq__, __le__, __lt__, __gt__ и __ge__. Вместо определения всех из них вы можете использовать декоратор класса functools.total_ordering в версии 2.7 +/3.1+. __cmp__ отсутствует в 3.x.

Ответ 2

Я бы сделал это, переопределив __cmp__

class myclass:
    def __init__(self,a,b):
        self.key1 = a
        self.key2 = b

    def __cmp__(self, other):
        return cmp(self.key2, other.key2)