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

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。