2016-11-28 28 views
2

下面這段代碼工作在Python 3(3.5.2)罰款,但提出了在Python 2(2.7.12)__eq__在超級對象

class Derived(int): 

    def __eq__(self, other): 
     return super(Derived, self).__eq__(other) 


a, b = Derived(1024), Derived(1729) 
print(a == b) 

Python 3的行爲是正常的AttributeError: 'super' object has no attribute '__eq__'。我試圖理解爲什麼它不會在Python 2

工作,請注意,這個問題不是'super' object has no attribute '__eq__'

+2

因爲在Python 2'int'不具有比較豐富的操作符(見[這裏](http://stackoverflow.com/questions/10809932/python-why-does-the-int-class-not-have-rich -comparison運營商狀-LT))。 Python 3實現了豐富的比較運算符,因爲'__cmp__'被解釋了。 –

回答

3

重複這到底是怎麼發生的事情是,爲Derived超類是int。在Python 2,int沒有實現豐富的比較運營商如__lt____gt__,或__eq__因爲它使用__cmp__代替。然而,__cmp__沒有在Python 3的支持,因此int實現豐富的比較運營商如__lt____gt__,並在Python 3。因此__eq__,在Derived在Python 2,super.__eq__因爲int.__eq__不存在在Python 2

不存在
+0

我種假定'int'從實現'__eq__'此'>>> INT .__ eq__ <方法的包裝器類型的對象「__eq__」在0x000000001E298C40>'但現在我試圖'INT .__當量__(1,2)'和出錯了。 'int .__ eq __(0)'returns'NotImplemented'你可以擴展所有這些工作嗎? – avamsi

+2

在Python 2'INT .__ eq__'在'int'類比較到另一個類,而不是比較'int's。所以'int .__ eq __(int)'將是true,但是'int .__ eq __(float)'將會是false。 –

+0

有道理。感謝您的澄清。 – avamsi