__eq__属性和相等运算符之间的关系?

时间:2014-08-27 14:05:22

标签: python python-2.7 operators equality

因此,以下内置类具有__eq__属性,(我假设)是您可以测试其实例是否相等的原因:

>>> 1.2.__eq__( 1.2 )
True
>>> 1.2 == 1.2
True
>>> 'hello'.__eq__( 'hi' )
False
>>> 'hello' == 'hi'  
False
>>> [1,2].__eq__( [1,2] )
True
>>> [1,2] == [1,2]  
True

然后我很惊讶地看到int个对象没有__eq__,但我们仍然可以比较它们:

>>> hasattr( 1, '__eq__' )
False
>>> 1 == 2 
False

发生了什么?我是否误解了__eq__和平等运算符之间的关系?

1 个答案:

答案 0 :(得分:5)

int个对象改为__cmp__ method

  

如果没有定义丰富的比较(见上文),则通过比较操作调用。

其中丰富的比较包括__eq__

演示:

>>> (1).__cmp__(2)
-1
>>> (1).__cmp__(1)
0
>>> (1).__cmp__(0)
1

__cmp__返回0时,两个值相等。

Python 3取消了cmp()比较和相关的特殊方法;在Python 3 int 中有__eq__方法:

>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=4, micro=0, releaselevel='final', serial=0)
>>> (1).__eq__(1)
True

此外,Python 3 int对象也提供了另一个rich comparison methods; __lt____le____ne____gt____ge__,Python 2版本中缺少所有方法。

Python最初只使用 __cmp__,只在Python 2.1中添加了丰富的比较支持(参见PEP 207),并且直到Python 3才转换整数。在保持两种比较系统方面没有多大意义,因此对表现较差的形式进行了抛弃。