Python におけるオブジェクトの動作は、その型によって決まります。いわゆるタイプは、特定の特定の操作をサポートするものです。数値オブジェクトはあらゆるプログラミング言語の基本要素であり、加算、減算、乗算、除算などの数学演算をサポートします。
Python の数値オブジェクトには整数と浮動小数点数が含まれており、+、-、*、/ などのさまざまな数学演算をサポートしています。 これらの演算子がないと、プログラムは関数呼び出しを使用して、add(2, 3)、sub(5, 2) などの数学演算を実行することしかできません。
プログラム内の演算子の機能は通常の数学演算の使用法と一致しているため、より簡単かつ直感的に使用できます。 Python では、これらの演算子は、object.__add__() や object.__sub__() などのオブジェクトのいくつかの特別なメソッドを定義することによって実装されます。ユーザーが独自のクラスを定義するときに上記の特別なメソッドを実装すると、カスタム クラスのオブジェクトは対応する数学的演算をサポートできるため、デジタル オブジェクトの動作をシミュレートできます。これにより、実際には演算子のオーバーロードの効果が得られます。
ここでは、加算演算をサポートする中国語の数値クラスを実装することによって、Python で一般的な数学演算をサポートする中国語の数値クラスを実装する方法について説明します。 ChineseNumber クラスの基本的な定義は次のとおりです。
現時点での効果は以下の通りです。
一般的な数学演算子
クラスを定義するときは、__add__() メソッドを実装して、このクラスに + 演算子を追加します。次のメソッドを ChineseNumber に追加します:
現時点では、 ChineseNumber オブジェクトは + を使用できます。
+ の場合、a + b は a.__add__(b) を呼び出すことと同じです。同様に、他の算術演算子を定義できます。以下の表を参照してください。
オペランド反転を伴う数学演算子 (オペランドの反映/交換)
2 は整数型であり、その __add__() メソッドは ChineseNumber クラスのオブジェクトをサポートしていないため、上記のエラーが発生しました。オペランド反転を使用して数学演算子を定義すると、この問題を解決できます。 __radd__() メソッドを ChineseNumber クラスに追加して、オペランド反転の + 演算を実装します。
a + b の場合、a が __add__() メソッドを定義していない場合、Python は b の __radd__() メソッドを呼び出そうとします。このとき、a + b は b.__radd__(a) を呼び出すことと同じになります。
同様に、オペランド反転を伴う他の数学演算子を定義できます。以下の表を参照してください。
算術代入演算子
演算代入演算子は、単一の演算子を使用して演算と代入演算を完了します。たとえば、a += b は、a = a + b を呼び出すことと同じです。 += 演算子を実装するには、__iadd__() メソッドを ChineseNumber に追加します。
この時、
同様に、他の演算代入演算子も定義できます。以下の表を参照してください。
単項数学演算子
単項数学演算子は、負の数を取得するための演算子など、オペランドが 1 つだけある演算です。 - 対応する特殊関数は __neg__() です。 ChineseNumber の __neg__() メソッドを追加します
この時点で、 ChineseNumber オブジェクトは - 操作をサポートします。
その他の単項演算子については、以下の表を参照してください。