Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの演算子オーバーロード入門|__add__メソッドでベクトル加算を実装する方法

演算子のオーバーロードとは?

演算子のオーバーロード(operator overloading)とは、+- といった組み込み演算子に対して、自作クラス独自の動作を定義できるPythonの仕組みです。特殊メソッド(マジックメソッド)をクラス内に実装することで、オブジェクト同士の演算を直感的な構文で記述できるようになります。

例えば、2次元ベクトルを表す Vector クラスを作成したとしましょう。この状態でプラス演算子(+)を使って2つのベクトルを加算すると、どうなるでしょうか?そのままでは、Pythonはエラーを返す可能性が高いです。

しかし、クラス内で __add__ メソッドを定義してベクトルの加算処理を実装しておけば、プラス演算子は期待どおりに動作するようになります。

サンプルコード

#!/usr/bin/python
class Vector:
    def __init__(self, a, b):
        self.a = a
        self.b = b
    def __str__(self):
        return 'Vector (%d, %d)' % (self.a, self.b)
    def __add__(self, other):
        return Vector(self.a + other.a, self.b + other.b)

v1 = Vector(2, 10)
v2 = Vector(5, -2)
print(v1 + v2)

※ 上記はPython 3対応の記法(print()関数)を使用しています。

コードのポイント

  • __init__: インスタンス生成時にベクトルの成分(a, b)を初期化します。
  • __str__: print() 実行時に表示される文字列表現を定義します。
  • __add__: プラス演算子が使われたときの動作を定義し、新しい Vector オブジェクトを返します。

実行結果

上記のコードを実行すると、以下のような結果が出力されます。

Vector (7, 8)

覚えておきたい主な特殊メソッド

特殊メソッド対応する演算子・機能
__add__+ (加算)
__sub__- (減算)
__mul__* (乗算)
__eq__== (等価比較)
__str__str()・print() での文字列表現

まとめ

演算子のオーバーロードを活用することで、自作クラスでも組み込み型のように自然な演算構文を実現できます。Vector クラスのように、行列や複素数などの数学的なオブジェクトを実装する際に特に役立つテクニックなので、ぜひマスターしておきましょう。

  1. Pythonの継承とは?単一継承と階層継承の基本をサンプルコードで解説

    本記事では、Python 3.xにおける継承(インヘリタンス)とクラスの拡張方法について詳しく解説します。 継承とは、現実世界のモノや概念の関係性を自然に表現できる、オブジェクト指向プログラミングの中核となる仕組みです。継承を活用すると、次のようなメリットが得られます。 再利用性:すでに書いたコードを流用でき、重複を削減できる 推移性:クラス間の関係を連鎖的に引き継げる 開発速度の向上:ゼロから書かずに済むため、短期間で開発できる 保守性・拡張性:既存クラスを壊さずに機能を追加しやすい 継承の5つの種類 Pythonの継承は、その構造によって主に以下の5種類に分類されます。 単一継承(

  2. Pythonの演算子オーバーロードとは?仕組みと実装方法をわかりやすく解説

    +演算子は、数値の加算にも文字列の連結にも使用できることをご存じでしょう。これが可能なのは、+演算子が int クラスと str クラスの両方でオーバーロードされているためです。 実は、Pythonの演算子はそれぞれのクラス内で定義されたメソッドにすぎません。このように、演算子に対応するメソッドを自分で定義することを「演算子オーバーロード(operator overloading)」と呼びます。 たとえば、独自に定義したクラス(ユーザー定義型)のオブジェクト同士で + 演算子を使えるようにしたい場合は、__add__ という特殊メソッドを定義する必要があります。 サンプルコード:Circleク