functools.total_ordering(cls) Given a class defining one or more rich
comparison ordering methods, this class decorator supplies the rest.
This simplifies the effort involved in specifying all of the possible
rich comparison operations:
The class must define one of __lt__(), __le__(), __gt__(), or
__ge__(). In addition, the class should supply an __eq__() method.
有几种方法可以将对象标记为可排序。第一次丰富的比较,由一组函数定义:
也可以只定义一个函数:
如果要定义自定义
__hash__
函数,则应该定义最后一个。请参阅doc。Python 2和3之间没有任何区别。
对于可排序性:
你应该定义比较方法。这使您的项目可排序。一般来说,你不应该喜欢
__cmp__()
。我通常使用functools.total_ordering decorator。
你应该小心,你的比较方法没有任何副作用。(更改对象的任何值)
用于散列:
您应该实现
__hash__()
方法。我认为最好的方法是返回hash(repr(self))
,因此哈希值是唯一的。我几乎把这个作为对其他答案的评论,但它本身就是一个答案。
要使项目可排序,它们只需要实现
__lt__
。这是内置排序所使用的唯一方法。其他比较或
functools.total_ordering
仅当您真正想在类中使用比较运算符时才需要。如其他人所述,为了使您的项可以散列化,您实现了
__hash__
。您还应该以兼容的方式实现__eq__
——等价的项应该散列相同的值。相关问题 更多 >
编程相关推荐