因此,以下内置类具有__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__
和平等运算符之间的关系?
答案 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才转换整数。在保持两种比较系统方面没有多大意义,因此对表现较差的形式进行了抛弃。