この記事では__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らしいコードを追求するうえで、ぜひ活用してみてください。
コメント