使python用户定义的类可排序,hashab

2024-06-07 12:37:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在python中使用户定义的类可排序和/或哈希时,需要重写/实现哪些方法?

有什么问题需要注意?

我在解释器中键入dir({}),以获取内置dict的方法列表。其中,我想我需要实现

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

Python3和Python2必须实现哪些方法有区别吗?


Tags: 方法用户gt列表键入定义排序dir
3条回答

有几种方法可以将对象标记为可排序。第一次丰富的比较,由一组函数定义:

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__函数,则应该定义最后一个。请参阅doc

Python 2和3之间没有任何区别。

对于可排序性:

你应该定义比较方法。这使您的项目可排序。一般来说,你不应该喜欢__cmp__()

我通常使用functools.total_ordering decorator。

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__()方法。我认为最好的方法是返回hash(repr(self)),因此哈希值是唯一的。

我几乎把这个作为对其他答案的评论,但它本身就是一个答案。

要使项目可排序,它们只需要实现__lt__。这是内置排序所使用的唯一方法。

其他比较或functools.total_ordering仅当您真正想在类中使用比较运算符时才需要。

如其他人所述,为了使您的项可以散列化,您实现了__hash__。您还应该以兼容的方式实现__eq__——等价的项应该散列相同的值。

相关问题 更多 >

    热门问题