Pythonの__eq__とは何かをわかりやすく解説!!!!!

この記事では__eq__が何かを、実装例も合わせて超簡単に説明します。

__eq__

__eq__ とは、Python において「==」演算子が呼び出される際に挙動を定義するための特別なメソッド(特殊メソッド)のことです。クラスのオブジェクト同士の等価比較を行う際に、__eq__ メソッドが呼び出されます。

Pythonで==演算子を使ったとき、内部的には以下のように動作しています

# p1 == p2 の比較をしたとき
p1.__eq__(p2)

つまり、== 演算子による等価比較の挙動をカスタマイズしたい場合は、クラス内で __eq__ メソッドを定義すればよいわけです。デフォルトの __eq__ は「同じオブジェクト(同一インスタンス)かどうか」を比較する挙動ですが、クラスにおける属性値が同じ場合に「等しい」と判断したいなど、自由にロジックを組み込むことができます。

実装例:平面の点の比較

それでは、実際にクラスを定義し、__eq__ を実装する例を見てみましょう。ここでは 2 次元平面上の点を表す Point クラスを例とします。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def __eq__(self, other):
        # 同じクラスのインスタンスかチェック
        if not isinstance(other, Point):
            return NotImplemented
        
        # x座標とy座標の値が一致していればTrue
        return (self.x == other.x) and (self.y == other.y)

p1 = Point(1, 2)
p2 = Point(1, 2)
p3 = Point(2, 3)

print(p1 == p2)  # True
print(p1 == p3)  # False

 isinstance(other, Point) で型チェックを行い、違う型なら NotImplemented を返しています。Pythonは NotImplemented を受け取ると、別の比較ロジックを試みるか、最終的に False として処理することもあります。
 p1 == p2 の比較では座標が (1, 2) で一致するため True を返します。
p1 == p3 では座標が異なるため False となります。

__eq__ を正しく実装することで、クラスの等価比較が直感的になるだけでなく、セットや辞書のキーとして活用できるなど利便性が格段に上がります。Pythonらしいコードを追求するうえで、ぜひ活用してみてください。

記事をシェアして話のネタにする

コメント

コメントする

目次