Python クラスで等価性をサポートするエレガントな方法
Pythonのクラスで等価性をサポートするためには、__eq__
メソッドを実装することが一般的です。このメソッドをオーバーライドすることで、クラスのインスタンス同士を比較する際に、より柔軟な等価性の定義を提供することができます。
例1: クラスの属性を比較する
class Point: def __init__(self, x, y): self.x = x self.y = y def __eq__(self, other): return self.x == other.x and self.y == other.y p1 = Point(1, 2) p2 = Point(1, 2) p3 = Point(3, 4) print(p1 == p2) # True print(p1 == p3) # False
この例では、Point
クラスのインスタンス同士を比較する際に、x
とy
の値が等しいかどうかを基準にしています。
例2: 継承を考慮した等価性の定義
class Shape: def __init__(self, sides): self.sides = sides def __eq__(self, other): return self.sides == other.sides class Triangle(Shape): def __init__(self): super().__init__(3) t1 = Triangle() t2 = Triangle() s = Shape(3) print(t1 == t2) # True print(t1 == s) # True
この例では、Shape
クラスを継承したTriangle
クラスで、sides
の値が等しいかどうかを比較しています。
例3: 特殊メソッド__hash__
を組み合わせた等価性の定義
class Person: def __init__(self, name, age): self.name = name self.age = age def __eq__(self, other): return self.name == other.name and self.age == other.age def __hash__(self): return hash((self.name, self.age)) p1 = Person('Alice', 30) p2 = Person('Alice', 30) p3 = Person('Bob', 25) print(p1 == p2) # True print(p1 == p3) # False print(hash(p1)) # ハッシュ値を表示
この例では、__hash__
メソッドを組み合わせて、等価性とハッシュ値の計算を同時に行っています。
Pythonのクラスで等価性(”等しさ”)をサポートするエレガントな方法の1つは、__eq__メソッドを実装することです。このメソッドをクラスに追加すると、そのクラスのインスタンス同士を比較する際に使用されます。例えば、以下のように__eq__メソッドを実装することで、2つのインスタンスが等しいかどうかを判定できます。
“`python
class MyClass:
def __init__(self, value):
self.value = valuedef __eq__(self, other):
return isinstance(other, MyClass) and self.value == other.valueobj1 = MyClass(10)
obj2 = MyClass(10)print(obj1 == obj2) # True
“`このように、__eq__メソッドを適切に実装することで、Pythonのクラスで等価性をサポートするエレガントな方法を実現できます。