3.3.7 数値型をエミュレーションする
以下のメソッドを定義して、数値型オブジェクトをエミュレートすることがで
きます。特定の種類の数値型ではサポートされていないような演算に対応する
メソッド (非整数の数値に対するビット単位演算など) は、未定義のままにし
ておかなければなりません。
-
| __floordiv__( |
self, other) |
| __pow__( |
self, other[, modulo]) |
- これらのメソッドは、二項算術演算 (
-, *, //, %,
divmod(),
pow(), **, <<,
>>, &, ^, |)
を実現するために呼び出されます。例えば、式 x+y
の場合、x が __add__() メソッドをもつクラスのインスタン
スであれば、x.__add__(y) が呼び出されます。
__divmod__() メソッドは、__floordiv__() と
__mod__() を使った場合と等価にならなければなりません;
__truediv__() (下記参照) と関連づける必要はありません。
組み込みの三項演算子バージョンの関数
pow() をサポートする場合には、
__pow__() は、オプションとなる第三の引数を受け取れなくては
なりません。
-
| __truediv__( |
self, other) |
- 除算演算 (
/) は、これらのメソッドで実現されています。
__truediv__() は、 __future__.division が有効であると
きに使われます。それ以外の場合には __div__() が使われますs。
二つのメソッドのうち一方しか定義されていなければ、オブジェクトは
他方の演算コンテキストをサポートしなくなります; このとき、
TypeError が送出されます。
-
| __rtruediv__( |
self, other) |
| __rfloordiv__( |
self, other) |
-
| __rdivmod__( |
self, other) |
| __rlshift__( |
self, other) |
| __rrshift__( |
self, other) |
- これらのメソッドは二項算術演算
(
+,
-, *, /, %,
divmod(),
pow(), **, <<,
>>, &, ^, |)
を実現しますが、メソッド呼び出しが行われ
る被演算子が逆転して (reflected, swapped: 入れ替えられて) います。
これらの関数は、左側の被演算子が対応する演算をサポートしていない場合に
のみ呼び出されます。例えば、x-y において、
y が __rsub__() メソッドを持つクラスのインスタンスであ
る場合、y.__rsub__(x) が呼び出されます。三項演算子
pow() が __rpow__() を呼ぶことは
ないので注意してください (型強制の規則が非常に難解になるからです)。
-
| __itruediv__( |
self, other) |
| __ifloordiv__( |
self, other) |
-
| __ipow__( |
self, other[, modulo]) |
| __ilshift__( |
self, other) |
| __irshift__( |
self, other) |
- これらのメソッドは、累算算術演算 (augmented arithmetic operations,
+=, -=, *=, /=, %=,
**=, <<=, >>=, &=,
^=, |=) を実現するために呼び出されます。
これらのメソッドでは、(self の値を変更することで) 演算を
インプレースで行うよう試み、その結果
(インプレースで演算を行えない場合や、行ってはならない場合には
self 自体) を返さなければなりません。
特定のメソッドが定義されていない場合、その累算算術演算は通常のメソッド
で代用されます。例えば、x+=y を評価する際、
x が __iadd__() メソッドを持つクラスのインスタンスで
あれば、x.__iadd__(y) が呼び出されます。反対に、
x が __iadd() メソッドを持たないクラスのインスタンスで
あれば、x+y に基づいて
x.__add__(y) および
y.__radd__(x)
を考慮します。
-
- 単項算術演算 (
-,
+, abs() および ~)
を実現するために呼び出されます。
-
- 組み込み関数
complex(),
int(), long(),
および float() を実現するために呼び出さ
れます。適切な型の値を返さなければなりません。
-
- 組み込み関数
oct() および
hex()を実現するために呼び出されます。文字列型を返さなければなりません。
-
``型混合モード (mixed-mode)'' での数値間の算術演算を実現するために
呼び出されます。 self と other を共通の数値型に変換して、
2 要素のタプルにして返すか、不可能な場合には
None を返さなけれ
ばなりません。共通の型が other の型になる場合、 None を
返すだけで十分です。この場合、インタプリタはもう一方のオブジェクトを調
べて型強制を行おうとするからです (とはいえ、もう一方の値の型が実装上変
更できない場合には、ここで self を other の型に変換してお
いた方が便利です)。戻り値に NotImplemented を使うのは、
None を返すのと同じです。
Release 2.3.3, documentation updated on 平成16年6月28日.
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。