以下のメソッドを定義して、数値型オブジェクトをエミュレートすることがで きます。特定の種類の数値型ではサポートされていないような演算に対応する メソッド (非整数の数値に対するビット単位演算など) は、未定義のままにし ておかなければなりません。
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other[, modulo]) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
+
, -
, *
, //
, %
,
divmod(),
pow(), **
, «
,
»
, &
, ^
, |
)
を実現するために呼び出されます。例えば、式 x+
y
の場合、x が __add__() メソッドをもつクラスのインスタン
スであれば、x.__add__(y)
が呼び出されます。
__divmod__() メソッドは、__floordiv__() と
__mod__() を使った場合と等価にならなければなりません;
__truediv__() (下記参照) と関連づける必要はありません。
組み込みの三項演算子バージョンの関数
pow() をサポートする場合には、
__pow__() は、オプションとなる第三の引数を受け取れなくては
なりません。
こらのメソッドが渡された引き数に対する操作を提供していない場合には、
NotImplemented
を送出しなければなりません。
self, other) |
self, other) |
/
) は、これらのメソッドで実現されています。
__truediv__() は、 __future__.division
が有効であると
きに使われます。それ以外の場合には __div__() が使われますs。
二つのメソッドのうち一方しか定義されていなければ、オブジェクトは
他方の演算コンテキストをサポートしなくなります; このとき、
TypeError が送出されます。
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
+
,
-
, *
, /
, %
,
divmod(),
pow(), **
, «
,
»
, &
, ^
, |
)
を実現しますが、メソッド呼び出しが行われ
る被演算子が逆転して (reflected, swapped: 入れ替えられて) います。
これらの関数は、左側の被演算子が対応する演算をサポートしておらず
かつ両者の演算子が異なる場合にのみ呼び出されます。3.3
例えば、x-
y の式を評価する場合、
y が __rsub__() メソッドを持つクラスのインスタンスであ
って、しかも x.__sub__(y)
が NotImplemented
を返す場合には、
y.__rsub__(x)
が呼び出されます。
ただし、三項演算子 pow() が __rpow__() を呼ぶことは ないので注意してください (型強制の規則が非常に難解になるからです)。
注意: 右側の被演算子の型が左側の被演算子の型のサブクラスであり、 このサブクラスであるメソッドに対する逆転メソッドが定義されている場合には、 左側の被演算子の非逆転メソッドが呼ばれる前に、このメソッドが呼ばれます。 この振る舞いにより、サブクラスが親の操作をオーバーライドすることが 可能になります。
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other[, modulo]) |
self, other) |
self, other) |
self, other) |
self, other) |
self, other) |
+=
, -=
, *=
, /=
, %=
,
**=
, <
<=
, >
>=
, &=
,
**=
, <
<=
, >
>=
, &=
,
^=
, |=
) を実現するために呼び出されます。
これらのメソッドは、演算をその場で(self を変更する形で)
行うよう試み、その結果(変更された self またはその代わり
のもの)を返さなければなりません。
特定のメソッドが定義されていない場合、その累算算術演算は通常のメソッド
で代用されます。例えば、x+=
y を評価する際、
x が __iadd__() メソッドを持つクラスのインスタンスで
あれば、x.__iadd__(y)
が呼び出されます。反対に、
x が __iadd() メソッドを持たないクラスのインスタンスで
あれば、x+
y に基づいて
x.__add__(y)
および
y.__radd__(x)
を考慮します。
self) |
self) |
self) |
self) |
-
,
+
, abs() および ~
)
を実現するために呼び出されます。
self) |
self) |
self) |
self) |
self) |
self) |
self) |
self, other) |
None
を返さなけれ
ばなりません。共通の型が other
の型になる場合、 None
を
返すだけで十分です。この場合、インタプリタはもう一方のオブジェクトを調
べて型強制を行おうとするからです (とはいえ、もう一方の値の型が実装上変
更できない場合には、ここで self を other の型に変換してお
いた方が便利です)。戻り値に NotImplemented
を使うのは、
None
を返すのと同じです。