在python 2或3中,内置类具有显式定义的特殊方法。 Explicit is better than implicit以及所有爵士乐。
5. > 4.
# True
(5.).__ge__(4.)
# True
但是在python 2中,某些方法有例外,至少在整数中是这样。
5 > 4
# True
(5).__ge__(4)
# AttributeError: 'int' object has no attribute '__ge__'
# But not all of them fail!
(5).__add__(4)
# 9
这种行为背后的原因是什么?为什么这样设计?
我正在使用Python 2.7.12
答案 0 :(得分:1)
data model和python-2.x之间 python-3.x 已更新。在python-2.x中,可以使用__cmp__
method:
<强>
object.__cmp__(self, other)
强>如果富比较(见上文),则通过比较操作调用 没有定义的。如果
self < other
,则应返回负整数, 如果self == other
,则为零;如果为self > other
,则为正整数。如果未定义__cmp__()
,__eq__()
或__ne__()
操作, 类实例按对象标识进行比较(“地址”)。看到 还有关于__hash__()
的一些重要说明的描述 创建支持自定义比较操作的可哈希对象 并可用作字典键。 (注意:限制 自__cmp__()
以来未传播的异常已被删除 Python 1.5。)
(已添加格式)
富比较运算符是__le__
, __ge__
, etc.。所以在python-2.x中有一个额外的回退机制。这是为int
定义的,您可以看到:
>>> (2).__cmp__
<method-wrapper '__cmp__' of int object at 0x13ee140>
>>> (2).__cmp__(3)
-1
(Python 2.7.12)
此外python-2.x 提供cmp(..)
builtin function :
<强>
cmp(x, y)
强>比较两个对象
x
和y
并返回一个整数 结果。如果x < y
,则返回值为负,如果x == y
则返回零 如果x > y
,则严格为正。
(已添加格式)
在python-3.x中, __cmp__
已被删除,因为您可以阅读What’s New In Python 3.0:
cmp()
函数应视为已消失,__cmp__()
不再支持特殊方法。使用__lt__()
进行排序, 根据需要__eq__()
__hash__()
和其他丰富的比较。 (如果确实需要cmp()
功能,可以使用表达式(a > b) - (a < b)
作为cmp(a, b)
的等价物。)
(已添加格式)
此机制不仅仅是__cmp__
的包装:它首先会查看是否存在丰富的比较,如果不是__cmp__
本身的回退。