Создание класса, определяемого пользователем python, сортируемого, хешируемого

Какие методы нужно переопределять / реализовывать при создании пользовательских классов, сортируемых и / или хешируемых в python?

Каких же страхов нужно следить?

Я ввожу dir({}) в свой интерпретатор, чтобы получить список методов на встроенных dicts. Из них я предполагаю, что мне нужно реализовать некоторые подмножества

 ['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__'] 

Есть ли разница в том, какие методы должны быть реализованы для Python3, а не Python2?

  • Python dictionary: TypeError: unhashable type: 'list'
  • Хеширование словаря?
  • Python. Идентичность в наборах объектов. И хеширование
  • Что происходит, когда вы вызываете `if key in dict`
  • Классы словаря Python (которые являются объектами класса) сравниваются с несколькими компараторами
  • Как используется возвращаемое значение __hash__?
  • Python проверяет, что ключ определен в словаре
  • 3 Solutions collect form web for “Создание класса, определяемого пользователем python, сортируемого, хешируемого”

    Я почти опубликовал это как комментарий к другим ответам, но это действительно ответ сам по себе.

    Чтобы __lt__ элементы, им нужно только реализовать __lt__ . Это единственный метод, используемый встроенной сортировкой.

    Другие сравнения или functools.total_ordering нужны только в том случае, если вы действительно хотите использовать операторы сравнения с вашим классом.

    Чтобы сделать ваши товары хешируемыми, вы реализуете __hash__ как отмечали другие. Вы также должны реализовать __eq__ в совместимом режиме – элементы, которые эквивалентны, должны иметь то же самое.

    Между Python 2 и 3 нет никакой разницы.

    Для сортировки:

    Вы должны определить методы сравнения. Это упрощает сортировку ваших элементов. Как правило, вы не должны предпочитать __cmp__() .

    Обычно я использую декоратор functools.total_ordering.

    functools.total_ordering (cls). Учитывая класс, определяющий один или несколько методов упорядочения сравнения, этот декоратор класса предоставляет остальное. Это упрощает работу, связанную с определением всех возможных мощных операций сравнения:

    Класс должен определить один из __lt__() , __le__() , __gt__() или __ge__() . Кроме того, класс должен предоставить __eq__() .

    Вы должны быть осторожны, чтобы ваши методы сравнения имели побочный эффект. Вы не хотите, чтобы ваш класс менялся при выполнении сравнений.

    Для хеширования:

    Вы должны реализовать __hash__() . Я думаю, что лучший способ – вернуть hash(repr(self)) , поэтому ваш хэш будет уникальным.

    Существует несколько способов сортировки вашего объекта. Первое – богатое сравнение, определяемое набором функций:

     object.__lt__(self, other) object.__le__(self, other) object.__eq__(self, other) object.__ne__(self, other) object.__gt__(self, other) object.__ge__(self, other) 

    Также можно определить только одну функцию:

     object.__cmp__(self, other) 

    И последнее должно быть определено, если вы хотите определить пользовательскую функцию __hash__ . См. Документ .

    Python - лучший язык программирования в мире.