2016-04-28 8 views
13

dopo aver letto il libro "Fluent python", capisco come l'operatore == funzioni con oggetti python, usando il metodo __eq__(). Ma come funziona con le istanze int in python2?Come oggetto int() usando l'operatore "==" senza il metodo __eq __() in 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__' 

in python3 tutti a.__eq__(b) ritorni True

+1

http://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in- quale ordine guarda alcune risposte qui, penso che lo spieghino bene – sjr59

+1

ipotesi selvaggia, ma 'dall'operatore import eq; eq (2,2) 'funziona in Python2. O quello o usando '__cmp__' –

+1

' esiste un .__ cmp__', che potrebbe essere ciò che Python 2 sta usando. – Blender

risposta

8

pitone prefers to use rich comparison functions (__eq__, __lt__, __neq__, ecc), ma se questi mancano, si torna a utilizzare una sola funzione di confronto (__cmp__, rimosso in Python 3):

Questi sono i cosiddetti metodi di "confronto ricco" e sono chiamati per gli operatori di confronto preferibilmente a __cmp__() di seguito.

Il Python 2 integer type non implementa una ricca funzione di confronto:

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

In Python 3, il integer type (ora una lunga) implementa solo una ricca funzione di confronto, dal momento che Python 3 cessato il supporto per __cmp__:

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

Questo è il motivo per cui (123).__eq__ non esiste. Invece, Python 2 ricade (123).__cmp__ quando si verifica l'uguaglianza di due numeri interi:

>>> (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

grazie mille per una risposta dettagliata! –

6

In Python 2, l'oggetto int utilizza il metodo anziché i metodi ricchi come __eq__(), __lt__(), __gt__() e altri __cmp__().

+0

Come lo sai? Hai un riferimento nella documentazione o ...? –

+3

Puoi verificarlo eseguendo 'dir (int_instance)' in Python; non esiste un metodo '__eq__' disponibile. Puoi leggere di più su '__cmp __()' rispetto agli operatori ricchi [qui.] (Https://docs.python.org/2/reference/datamodel.html) –

Problemi correlati