2016-04-28 24 views
13

Nachdem ich das Buch "Fluent Python" gelesen habe, verstehe ich, wie == Operator mit Python-Objekten arbeitet, mit __eq__() Methode. Aber wie funktioniert es mit int Instanzen in Python2?Wie int() -Objekt mit "==" -Operator ohne __eq __() -Methode 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 alle a.__eq__(b) kehrt True

+1

http://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in- what-order schauen Sie sich ein paar Antworten hier an, ich denke, sie erklären es gut – sjr59

+1

Wild rate, aber 'vom Operator importieren eq; eq (2,2) 'funktioniert in Python2. Entweder das oder die Verwendung von '__cmp__' –

+1

' a .__ cmp__' existiert, was Python 2 möglicherweise benutzt. – Blender

Antwort

8

Python prefers to use rich comparison functions (__eq__, __lt__, __neq__, etc.), aber wenn diese nicht vorhanden ist, fällt es zurück eine einzige Vergleichsfunktion zu verwenden (__cmp__, entfernt in Python 3):

These sind die sogenannten "Rich-Comparison" -Methoden und werden für Vergleichsoperatoren bevorzugt gegenüber __cmp__() unten genannt.

Die Python 2 integer type keine reiche Vergleichsfunktion implementieren:

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

In Python 3, die integer type (heute ein lang) implementiert nur eine reiche Vergleichsfunktion, da Python 3 Unterstützung für __cmp__ fiel:

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

Dies ist, warum (123).__eq__ nicht existiert. Stattdessen fällt Python 2-(123).__cmp__ zurück, wenn die Gleichheit zweier ganzer Zahlen testen:

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

vielen Dank für die ausführliche Antwort! –

6

In Python 2 die int Objekt verwendet die __cmp__() Methode anstelle der reichen Methoden wie __eq__(), __lt__(), __gt__() und andere.

+0

Woher weißt du das? Haben Sie eine Referenz in der Dokumentation oder ...? –

+3

Sie können dies überprüfen, indem Sie 'dir (int_instance)' in Python ausführen; Es gibt keine '__eq__' Methode. Sie können mehr über '__cmp __()' im Vergleich zu den Rich-Operatoren [hier.] Lesen (https://docs.python.org/2/reference/datamodel.html) –