自定义类排序:没有抛出错误,什么是Python测试?

rep*_*cus 8 python object python-2.x comparison-operators

如果没有指定对象的相等比较属性,Python在使用>和时仍然会做一些事情<.如果你没有指定__gt__或者实际比较这些对象的Python是什么__lt__?我希望这里有一个不受支持的操作数错误,就像你在尝试将两个对象一起添加而没有defing时所得到的那样__add__.


In [1]: class MyObject(object):
   ...:     pass
   ...: 
In [2]: class YourObject(object):
   ...:     pass
   ...: 
In [3]: me = MyObject()
In [4]: you = YourObject()
In [5]: me > you
Out[5]: False
In [6]: you > me
Out[6]: True

Mar*_*ers 6

对对象施加任意顺序.排序仅定义为在程序执行中稳定.

这意味着在比较任意对象时,由Python实现来定义排序.如果类型相同(来自C源),CPython使用内存地址:

if (v->ob_type == w->ob_type) {
    /* When comparing these pointers, they must be cast to
     * integer types (i.e. Py_uintptr_t, our spelling of C9X's
     * uintptr_t).  ANSI specifies that pointer compares other
     * than == and != to non-related structures are undefined.
     */
    Py_uintptr_t vv = (Py_uintptr_t)v;
    Py_uintptr_t ww = (Py_uintptr_t)w;
    return (vv < ww) ? -1 : (vv > ww) ? 1 : 0;
}
Run Code Online (Sandbox Code Playgroud)

同样的值是基础id()功能,并且也代表了默认的repr()自定义类的字符串,因此可能会出现repr()类别确定排序.这只是内存地址.

对于那些对象不是同一类型,该类型的名称来代替(有相同数目的类型在别人面前排序),如果类型不同,但他们的名字是相同的,代码回落到该类型的内存地址(而不是类型相同时实例的内存地址).

这种隐式排序被认为是语言中的错误,并已在Python 3中得到纠正:

排序比较操作符(<,<=,>=,>)提出一个TypeError例外,当操作数没有意义的自然顺序.

这适用于未实现必要的排序挂钩的自定义类:

>>> class Foo(): pass
... 
>>> Foo() < Foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unorderable types: Foo() < Foo()
Run Code Online (Sandbox Code Playgroud)