Python クラスで等価性(等しさ)をサポートするエレガントな方法

PYTHON3 チュートリアル

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クラスのインスタンス同士を比較する際に、xyの値が等しいかどうかを基準にしています。

例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 = value

def __eq__(self, other):
return isinstance(other, MyClass) and self.value == other.value

obj1 = MyClass(10)
obj2 = MyClass(10)

print(obj1 == obj2) # True
“`

このように、__eq__メソッドを適切に実装することで、Pythonのクラスで等価性をサポートするエレガントな方法を実現できます。

購読
通知
0 Comments
Inline Feedbacks
View all comments