制作一个python用户定义的类可sorting,可sorting
在python中使用用户定义的类可sorting和/或可sorting时,需要重写/实现哪些方法?
有什么需要注意的?
我在我的解释器中键入dir({})
以获取内置字典中的方法列表。 其中,我假设我需要一些实现一些子集
['__cmp__', '__eq__', '__ge__', '__gt__', '__hash__', '__le__', '__lt__', '__ne__']
Python3与Python2相比,在哪些方法中必须实现差异?
我几乎把这个作为对其他答案的评论,但它本身就是一个真正的答案。
为了使你的物品可以sorting,他们只需要实现__lt__
。 这是内置sorting所使用的唯一方法。
其他比较或functools.total_ordering
只有当你真的想在你的类中使用比较运算符时才需要。
为了使你的项目可以__hash__
,你实现__hash__
其他人指出。 您还应该以兼容的方式实现__eq__
– 相同的项目应该散列相同。
Python 2和3之间没有任何区别。
为了sorting:
你应该定义比较方法。 这使您的物品可sorting。 一般来说,你不应该喜欢__cmp__()
。
我通常使用functools.total_ordering装饰器。
functools.total_ordering(cls)给定一个定义一个或多个比较sorting方法的类,这个类装饰器提供剩余的。 这简化了指定所有可能的丰富比较操作的工作:
该类必须定义
__lt__()
,__le__()
__lt__()
,__le__()
__gt__()
或__ge__()
。 另外,这个类应该提供一个__eq__()
方法。
你应该小心你的比较方法有副作用。 比较时你不希望你的class级改变。
对于散列:
你应该实现__hash__()
方法。 我认为最好的方法是返回hash(repr(self))
,所以你的哈希将是唯一的。
有几种标记对象的方法可sorting。 第一个丰富的比较,由一组函数定义:
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__
函数。 看文档 。
实现__lt__(self,other)
方法是让你的类可sorting的答案。
它不仅可以用于sorted(iterable)
的内置方法,也可以用于通过heapq
模块的优先级队列。
另外,我不喜欢python的devise,所以很多'__ge__', '__gt__', '__le__', '__lt__', '__ne__'
方法都是不直观的 !
相比之下,Java的Interface Comparable<T>
(参见java doc )返回一个负整数,零或正整数,因为该对象小于,等于或大于指定的对象,这是直接友好的 !