3.4.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__() は、オプションとなる第三の引数を受け取れなくては なりません。

こらのメソッドが渡された引き数に対する操作を提供していない場合には、 NotImplemented を送出しなければなりません。

__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: 入れ替えられて) います。 これらの関数は、左側の被演算子が対応する演算をサポートしておらず かつ両者の演算子が異なる場合にのみ呼び出されます。3.3

例えば、x-y の式を評価する場合、 y__rsub__() メソッドを持つクラスのインスタンスであ って、しかも x.__sub__(y)NotImplemented を返す場合には、 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()を実現するために呼び出されます。文字列型を返さなければなりません。

__index__( self)
operator.index() を実装するために呼び出されます。 また、(スライシング)のように Python が整数オブジェクトを必要とする 場合には何処でも呼び出されます。 整数(int もしくは long) を返す必要があります。 バージョン 2.5 で 新たに追加 された仕様です。

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



脚注

... かつ両者の演算子が異なる場合にのみ呼び出されます。3.3
同じ型の操作に対しては、 (__add__()のような)逆転できないメソッドが失敗した時と 同じような想定のもと処理されます。 これは、逆転したメソッドを呼び出すことができないからです。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。