2017-05-29 20 views
-1

整数変数xを値0と宣言しました。python: 'int'オブジェクトに属性 '__iadd__'がありません

>>> x = 0 

は、私はこの行を実行すると:

>>> x += 3 
>>> x 
3 

すべてがうまくいきます。私はこの行を実行するときしかし:

>>> x.__iadd__(3) 

Pythonは例外が発生します:

operatorモジュールの official python documentation+=オペレータが __iadd__メソッドを呼び出すと述べながら、Pythonはこの例外をスローするのはなぜ
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'int' object has no attribute '__iadd__' 

operatorモジュール用公式Pythonドキュメントで

+3

'__iadd__'が定義されていない場合、' x + = y'は 'x = x + y'に戻ります。 https://docs.python.org/3/reference/datamodel.html#object.__iadd__をご覧ください。 – jonrsharpe

答えて

5

+=オペレータが__iadd__メソッドを呼び出して言いましたか?

いいえ、それはa += ba = operator.iadd(a, b)、ないa.__iadd__(b)と同等であることを述べています。

operator.iadd(a, b)a.__iadd__(b)と等価ではありません。 は、__iadd__が存在しない場合、またはNotImplementedを返した場合、__add__および__radd__に戻ります。

3

それは言っていません。

operator.iadd(a, b)
operator.__iadd__(a, b)

a = iadd(a, b)a += bと同等です:あなたがマニュアルに記載さにリンクしていることはoperatorモジュールです。

operatorモジュールには、演算子などの関数に相当するものがありますが、標準のPython演算子は定義していません。 x.__iadd__については何も言わない。


関連ドキュメントはかなりthisある:

object.__iadd__(self, other)

これらの方法は、拡張演算割り当て(+=、...)を実装するために呼び出されます。これらのメソッドは、インプレース操作(自己の変更)を行い、その結果を返さなければなりません(自己かもしれません)。 特定のメソッドが定義されていない場合、拡張割り当ては通常のメソッドに戻ります。 ...

したがって、オブジェクト+=操作の挙動をオーバーライドする__iadd__を定義することができ、そのようなメソッドが定義されていない場合、それはデフォルトa = a + b動作に戻って落ちます。

関連する問題