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
对对象施加任意顺序.排序仅定义为在程序执行中稳定.
这意味着在比较任意对象时,由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)