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のクラスで等価性をサポートするエレガントな方法を実現できます。
