在python中对类实例进行排序

noi*_*oio 2 python sorting

python 2.7用什么来排序普通类实例?我对默认排序行为感兴趣。

假设我有课

class S():
    pass
Run Code Online (Sandbox Code Playgroud)

然后,我可以创建几个实例,并对它们进行排序:

a = S(); b = S(); c = S()
l = [(a,'a'), (b,'b') ,(c, 'c')]
sorted(l)
Run Code Online (Sandbox Code Playgroud)

这将打印对象的某种排序。现在我有一个两部分的问题:

  • python是使用对象的__hash__(),因此使用对象id()吗?
  • 是否可以覆盖__hash__()以影响分类行为?

der*_*ann 5

Python 3的内置排序功能利用了__lt__类中的方法。

丰富的比较方法在Python中是特殊的,因为NotImplemented如果__lt__未定义,它们可以返回特殊的类型-请看此页面上的文档:http : //docs.python.org/reference/datamodel.html#the-标准类型层次结构

由于NotImplementedis 的真值,因此True任何布尔比较NotImplemented都会继续进行,就好像第一个元素实际上小于第二个元素一样,这将导致排序以与原来相同的顺序离开列表。

看一下交互式外壳。您将看到如何在一个排序中使用真值,并且Python认为两个对象彼此小于:

>>> class S():
...     pass
...
>>> a = S()
>>> b = S()
>>> a.__lt__( b )
NotImplemented
>>> if a.__lt__( b ):
...     print( "derp!" )
...
derp
>>> if b.__lt__(a):
...     print( "derp" )
...
derp
Run Code Online (Sandbox Code Playgroud)

这里有更多参考资料:

编辑: 看完python 2.7后,看起来对象的ID用于排序,并且在__lt__像您的示例这样的简单类上未定义该方法。抱歉给您带来任何混乱。