2016-04-28 2 views
13

после того, как я прочитал книгу «Свободный питон», я понимаю, как оператор == работает с объектами python, используя метод __eq__(). Но как это работает с int экземплярами в python2?Как объект int() использует оператор "==" без метода __eq __() в python2?

>>> a = 1 
>>> b = 1 
>>> a == b 
True 
>>> a.__eq__(b) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'int' object has no attribute '__eq__' 

в Python3 все a.__eq__(b) возвращает True

+1

http://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in- что-то посмотреть на несколько ответов здесь, я думаю, что они хорошо объясняют это. – sjr59

+1

Дикая догадка, но 'from operator import eq; eq (2,2) 'работает в Python2. Либо это, либо используя '__cmp__' –

+1

' a .__ cmp__' существует, что может быть тем, что использует Python 2. – Blender

ответ

8

Python prefers to use rich comparison functions (__eq__, __lt__, __neq__ и т.д.), но если таковые не существуют, он возвращается к использованию одной функции сравнения (__cmp__, снятую в Python 3):

Эти являются так называемыми методами «богатого сравнения» и вызываются для операторов сравнения, предпочтительнее __cmp__().

Python 2 integer type не реализует богатую функцию сравнения:

PyTypeObject PyInt_Type = { 
    ... 
    (cmpfunc)int_compare,      /* tp_compare */ 
    ... 
    0,           /* tp_richcompare */ 

В Python 3, integer type (теперь долго) реализует только богатую функцию сравнения, так как Python 3 прекращена поддержка __cmp__:

PyTypeObject PyLong_Type = { 
    ... 
    long_richcompare,       /* tp_richcompare */ 

Именно поэтому (123).__eq__ не существует. Вместо этого, Python 2 возвращается к (123).__cmp__ при проверке равенства двух чисел:

>>> (1).__eq__(2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'int' object has no attribute '__eq__' 
>>> (1).__cmp__(2) 
-1 
+0

Большое спасибо за подробный ответ! –

6

В Python 2, int объект использует метод __cmp__() вместо богатых методов, таких как, __eq__()__lt__(), __gt__() и другие.

+0

Откуда вы это знаете? У вас есть ссылка в документации или ...? –

+3

Вы можете проверить это, запустив 'dir (int_instance)' в Python; нет метода '__eq__'. Вы можете узнать больше о '__cmp __()' против богатых операторов [здесь.] (Https://docs.python.org/2/reference/datamodel.html) –