2016-07-27 1 views
5

浮動小数点値の整数値を追加する場合、私はフロートで呼び出された場合__add__方法は、このように、正常に動作していることに気づいた:パイソン:__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

'm .__ radd __(n)'のために 'NotImplemented'も返されました。 –

+0

@ this-vidor:そこに間違った' __radd__'メソッドがあります。 – user2357112

+0

@ user2357112 True!それが解決策です。 –

答えて

6

a + bは直接a.__add__(b)に変換されません。また、a.__add__が存在しない場合はb.__radd__(a)を返します。NotImplementedを返します。baの型のサブタイプのインスタンスである場合は返します。

+0

私はまだ混乱しています。 * anInt .__ add __(aFloat)* == * NotImplemented *しかし* aFloat .__ add __(anInt)*は、浮動小数点の合計を生成します。私は+/'__add__'が両方とも可換であると思いますか? – RBV

+1

@RBV: '+'も '__add__'も可換です。 '+ 'が可換である場合でも' [1] + [2]!= [2] + [1] 'のような場合は' + 'は可換ではなく、引数は操作をどのように扱うかを知る必要があります。 – user2357112

関連する問題