2014-08-27 55 views
1

所以下面內置類有一個__eq__屬性,(我認爲)就是爲什麼你可以測試他們的情況下平等:__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__與平等運算符之間的關係嗎?

回答

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.在保持比較兩個系統周圍的小點,因此表現力較差的形式開始流失。

+0

_in Python 3 int有一個'__cmp__'方法:_ - 我想你的意思是_does有一個'__eq__' method_ – 2014-08-27 14:09:37

+0

@kroolik:的確,已更正。 – 2014-08-27 14:10:03

相關問題