2016-04-28 24 views
13

"Fluent python" kitabını okuduktan sonra, __eq__() yöntemini kullanarak == operatörünün python nesnelerle nasıl çalıştığını anlıyorum. Peki python2'deki int örnekleriyle nasıl çalışır? python3 içindepython2'de __eq __() yöntemi olmadan "==" operatörünü kullanarak int() nesnesi nasıl?

>>> 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__' 

tüm a.__eq__(b) döner True Python 2'de

+1

http://stackoverflow.com/questions/3588776/how-is-eq-handled-in-python-and-in- Burada bir kaç cevaba bakarsak, sanırım bunu iyi açıklarlar. – sjr59

+1

Vahşi tahmin, fakat “operatör ithalatından eq; eq (2,2) 'Python2'de çalışır. Ya bu ya da '__cmp__' –

+1

'a .__ cmp__' kullanıldığında, Python 2'nin kullandığı durum olabilir. – Blender

cevap

8

Python prefers to use rich comparison functions (__eq__, __lt__, __neq__, vb) bu ​​yoktur, ama eğer, (Python 3 uzaklaştırıldı __cmp__) tek bir işlev kullanarak geri döner:

Bu "zengin karşılaştırma" yöntemleri olarak adlandırılır ve aşağıdaki __cmp__() tercihine göre karşılaştırma operatörleri için çağrılır. Python 3 __cmp__ için destek düştü beri, sadece zengin bir karşılaştırma işlevi uygulayan Python 3

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

, (şimdi uzun) integer type:

Python 2 integer type zengin karşılaştırma işlevi uygulamıyor:

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

(123).__eq__ yok nedeni budur. iki tam sayının eşitliği test ederken Bunun yerine, Python 2 (123).__cmp__ geri düşüyor:

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

detaylı cevap için çok teşekkürler! –

6

, int amacı yerine __eq__(), __lt__(), __gt__(), ve diğerleri gibi, zengin yöntemler __cmp__() yöntemini kullanır.

+0

Bunu nasıl biliyorsunuz? Dokümanlarda referans var mı, yoksa ...? –

+3

Bunu Python'da 'dir (int_instance)' yi çalıştırarak kontrol edebilirsiniz; '__eq__' yöntemi mevcut değil. __cmp __() 'hakkında daha fazla bilgiyi zengin operatörlere karşı [burada.] (Https://docs.python.org/2/reference/datamodel.html) –