##
3.3.7 数値型をエミュレーションする

以下のメソッドを定義して、数値型オブジェクトをエミュレートすることがで きます。特定の種類の数値型ではサポートされていないような演算に対応する メソッド (非整数の数値に対するビット単位演算など) は、未定義のままにし ておかなければなりません。

`__add__`( | self, other)

`__sub__`( | self, other)

`__mul__`( | self, other)

`__floordiv__`( | self, other)

`__mod__`( | self, other)

`__divmod__`( | self, other)

`__pow__`( | self, other[, modulo])

`__lshift__`( | self, other)

`__rshift__`( | self, other)

`__and__`( | self, other)

`__xor__`( | self, other)

`__or__`( | self, other)

  これらのメソッドは、二項算術演算 ( `-`, `*`, `//`, `%`, `divmod()`, `pow()`, `**`, `<``<`, `>``>`, `&`, `^`, `|`) を実現するために呼び出されます。例えば、式 x`+`y の場合、x が `__add__()` メソッドをもつクラスのインスタン スであれば、`x.__add__(y)` が呼び出されます。 `__divmod__()` メソッドは、`__floordiv__()` と `__mod__()` を使った場合と等価にならなければなりません; `__truediv__()` (下記参照) と関連づける必要はありません。 組み込みの三項演算子バージョンの関数 `pow()` をサポートする場合には、 `__pow__()` は、オプションとなる第三の引数を受け取れなくては なりません。

`__div__`( | self, other)

`__truediv__`( | self, other)

  除算演算 (`/`) は、これらのメソッドで実現されています。 `__truediv__()` は、 `__future__.division` が有効であると きに使われます。それ以外の場合には `__div__()` が使われますs。 二つのメソッドのうち一方しか定義されていなければ、オブジェクトは 他方の演算コンテキストをサポートしなくなります; このとき、 `TypeError` が送出されます。

`__radd__`( | self, other)

`__rsub__`( | self, other)

`__rmul__`( | self, other)

`__rdiv__`( | self, other)

`__rtruediv__`( | self, other)

`__rfloordiv__`( | self, other)

`__rmod__`( | self, other)

`__rdivmod__`( | self, other)

`__rpow__`( | self, other)

`__rlshift__`( | self, other)

`__rrshift__`( | self, other)

`__rand__`( | self, other)

`__rxor__`( | self, other)

`__ror__`( | self, other)

  これらのメソッドは二項算術演算 (`+`, `-`, `*`, `/`, `%`, `divmod()`, `pow()`, `**`, `<``<`, `>``>`, `&`, `^`, `|`) を実現しますが、メソッド呼び出しが行われ る被演算子が逆転して (reflected, swapped: 入れ替えられて) います。 これらの関数は、左側の被演算子が対応する演算をサポートしていない場合に のみ呼び出されます。例えば、x`-`y において、 y が `__rsub__()` メソッドを持つクラスのインスタンスであ る場合、`y.__rsub__(x)` が呼び出されます。三項演算子 `pow()` が `__rpow__()` を呼ぶことは ないので注意してください (型強制の規則が非常に難解になるからです)。

`__iadd__`( | self, other)

`__isub__`( | self, other)

`__imul__`( | self, other)

`__idiv__`( | self, other)

`__itruediv__`( | self, other)

`__ifloordiv__`( | self, other)

`__imod__`( | self, other)

`__ipow__`( | self, other[, modulo])

`__ilshift__`( | self, other)

`__irshift__`( | self, other)

`__iand__`( | self, other)

`__ixor__`( | self, other)

`__ior__`( | self, other)

  これらのメソッドは、累算算術演算 (augmented arithmetic operations, `+=`, `-=`, `*=`, `/=`, `%=`, `**=`, `<``<=`, `>``>=`, `&=`, `^=`, `|=`) を実現するために呼び出されます。 これらのメソッドでは、(self の値を変更することで) 演算を インプレースで行うよう試み、その結果 (インプレースで演算を行えない場合や、行ってはならない場合には self 自体) を返さなければなりません。 特定のメソッドが定義されていない場合、その累算算術演算は通常のメソッド で代用されます。例えば、x`+=`y を評価する際、 x が `__iadd__()` メソッドを持つクラスのインスタンスで あれば、`x.__iadd__(y)` が呼び出されます。反対に、 x が `__iadd()` メソッドを持たないクラスのインスタンスで あれば、x`+`y に基づいて `x.__add__(y)` および `y.__radd__(x)` を考慮します。

`__neg__`( | self)

`__pos__`( | self)

`__abs__`( | self)

`__invert__`( | self)

  単項算術演算 (`-`, `+`, `abs()` および `~`) を実現するために呼び出されます。

`__complex__`( | self)

`__int__`( | self)

`__long__`( | self)

`__float__`( | self)

  組み込み関数 `complex()`, `int()`, `long()`, および `float()` を実現するために呼び出さ れます。適切な型の値を返さなければなりません。

`__oct__`( | self)

`__hex__`( | self)

  組み込み関数 `oct()` および `hex()`を実現するために呼び出されます。文字列型を返さなければなりません。

`__coerce__`( | self, other)

  ``型混合モード (mixed-mode)'' での数値間の算術演算を実現するために 呼び出されます。 self と other を共通の数値型に変換して、 2 要素のタプルにして返すか、不可能な場合には `None` を返さなけれ ばなりません。共通の型が `other` の型になる場合、 `None` を 返すだけで十分です。この場合、インタプリタはもう一方のオブジェクトを調 べて型強制を行おうとするからです (とはいえ、もう一方の値の型が実装上変 更できない場合には、ここで self を other の型に変換してお いた方が便利です)。戻り値に `NotImplemented` を使うのは、 `None` を返すのと同じです。