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

Pythonの演算子はマジックメソッドに対応付けられている?対応表と使い方を解説

結論:Pythonの演算子はマジックメソッド(特殊メソッド)に対応付けられています

Pythonでは、+-== などの演算子は、内部で「マジックメソッド」(特殊メソッド・ダンダーメソッドとも呼ばれます)と呼ばれる特別な名前のメソッドに対応付けられています。たとえば a + b という式は、実際には a.__add__(b) というメソッド呼び出しとして評価されます。

この仕組みのおかげで、独自に定義したクラスでも組み込み型と同じように演算子を使えます。これを「演算子オーバーロード」と呼びます。

主な演算子とマジックメソッドの対応表

演算子・関数マジックメソッド意味
+__add__加算
-__sub__減算
*__mul__乗算
/__truediv__除算
//__floordiv__切り捨て除算
%__mod__剰余(余り)
**__pow__べき乗
==__eq__等価比較
!=__ne__非等価比較
<__lt__より小さい
<=__le__以下
>__gt__より大きい
>=__ge__以上
len()__len__要素数の取得
str() / print()__str__文字列表現への変換

カスタムクラスで演算子を実装する例

マジックメソッドを定義すれば、自作クラスのインスタンスに対しても直感的な演算子が使えるようになります。以下は2次元ベクトルの加算を実装した例です。

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)

    def __repr__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2)  # 出力: Vector(4, 6)

__add__ を定義したことで、v1 + v2 という読みやすい書き方が可能になりました。同様に、__eq__ を定義すれば == による比較が、__len__ を定義すれば len() 関数が利用できるようになります。

完全な対応一覧は公式ドキュメントで確認できます

すべての演算子とマジックメソッドの対応関係は、Python公式ドキュメントの「データモデル」の章にまとめられています。数値型のエミュレート、コンテナ型、比較演算など目的別に整理されているため、実装前に一度目を通しておくと安心です。

また、右辺の被演算子に対応する __radd__ のような「反射(reflected)版」や、+= に対応する __iadd__ のような「インプレース版」のメソッドも用意されている点にも注目してください。これらを適切に使い分けることで、より柔軟でPythonicなクラス設計が可能になります。

  1. Pythonの主なデータ型変換関数まとめ|int・float・str・listなどの使い方を実例付きで解説

    Pythonには、あるデータ型から別のデータ型へ値を変換するための組み込み関数が多数用意されています。この記事では、数値変換やコレクション変換に使える主要なデータ変換関数を、実際の実行例とともにわかりやすく解説します。 数値データの変換関数 int():整数への変換 浮動小数点数や、整数を表す文字列を整数(int)オブジェクトに変換します。文字列を変換する場合は、第2引数に基数を指定することで、8進数や16進数の文字列を整数に変換することもできます。 >>> int(11) 11 >>> int(11.15) 11 >>> int(2

  2. Pythonモジュールの保存場所を確認する方法【初心者向け解説】

    Pythonモジュールはどこに保存される?Pythonのモジュールは、通常、Pythonフォルダ内の /lib/site-packages ディレクトリに保存されています。ただし、環境によってパスが異なる場合もあるため、実際に自分の環境で確認する方法を知っておくと便利です。sys.pathでモジュール検索パスを確認するPythonがモジュールをインポートする際にどのディレクトリをチェックしているのかを確認したい場合は、sys.path を出力してみましょう。>>> import sys>>> print(sys.path)[, C:\\Python27, C