为什么整数在python 2中缺少一些特殊方法?

时间:2017-03-27 13:40:55

标签: python python-2.x

在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

1 个答案:

答案 0 :(得分:1)

data model之间 已更新。在中,可以使用__cmp__ method

  

<强> object.__cmp__(self, other)

     

如果富比较(见上文),则通过比较操作调用   没有定义的。如果self < other ,则应返回负整数,   如果self == other ,则为零;如果为self > other ,则为正整数。如果未定义__cmp__()__eq__()__ne__()操作,   类实例按对象标识进行比较(“地址”)。看到   还有关于__hash__()的一些重要说明的描述   创建支持自定义比较操作的可哈希对象   并可用作字典键。 (注意:限制   自__cmp__()以来未传播的异常已被删除   Python 1.5。)

(已添加格式)

富比较运算符是__le__, __ge__, etc.。所以在中有一个额外的回退机制。这是为int定义的,您可以看到:

>>> (2).__cmp__
<method-wrapper '__cmp__' of int object at 0x13ee140>
>>> (2).__cmp__(3)
-1

(Python 2.7.12)

此外 提供cmp(..) builtin function

  

<强> cmp(x, y)

     

比较两个对象xy并返回一个整数   结果。如果x < y,则返回值为负,如果x == y则返回零   如果x > y,则严格为正。

(已添加格式)

中, __cmp__已被删除,因为您可以阅读What’s New In Python 3.0

  

cmp()函数应视为已消失, __cmp__()   不再支持特殊方法。使用__lt__()进行排序,   根据需要__eq__() __hash__()和其他丰富的比较。 (如果确实需要cmp()功能,可以使用表达式   (a > b) - (a < b)作为cmp(a, b)的等价物。)

(已添加格式)

此机制不仅仅是__cmp__的包装:它首先会查看是否存在丰富的比较,如果不是__cmp__本身的回退。