2016-07-27 52 views
5

當添加一個整數值到一個浮點值,我意識到__add__方法是工作正常,如果稱爲上浮動,如這樣的:的Python:__add__和+,不同的行爲與浮子和整數

>>> n = 2.0 
>>> m = 1 
>>> n.__add__(m) 
3.0 

但如果不要求的整數:

>>> m.__add__(n) 
NotImplemented 

起初我認爲__add__只是被實施爲不同和intfloat類型(如浮動類型接受要被添加到int類型的,但不是相反)。然後我注意到,如果我使用+運算符,一切都可以正常工作:

>>> n + m 
3.0 
>>> m + n 
3.0 

有人知道爲什麼會發生這種情況嗎? __add__+彼此之間沒有很深的關係嗎?

+0

'NotImplemented'也返回'm .__ radd __(n)' –

+0

@ this-vidor:錯誤的__radd__'方法在那裏。 – user2357112

+0

@ user2357112正確!那就是解決方案。 –

回答

6

a + b不直接轉換爲a.__add__(b)。如果a.__add__不存在或返回NotImplemented,或者ba的子類型的實例,它也會嘗試b.__radd__(a)

+0

我還是很困惑。這怎麼解釋* anInt的行爲.__添加__(aFloat)* == * NotImplemented *但是* aFloat .__添加__(anInt)*產生浮動和?我會認爲+ /'__add__'都是可交換的? – RBV

+1

@RBV:'+'和'__add__'都不可交換。 '+'由於諸如'[1] + [2]!= [2] + [1]'的情況而不可交換,即使對於'+'是可交換的情況,'__add__'也是不可交換的,因爲只有一個爭論需要知道如何處理操作。 – user2357112

相關問題