マジックメソッド: Pythonic なクラス
__xxx__ で演算子や組み込み関数をカスタマイズ。
マジックメソッド
__xxx__ 形式の特殊メソッド。
ダンダー
double-underscore の略。
演算子オーバーロード
+, ==, [] などをカスタマイズ。
マジックメソッド
最も有名な呪文は `__init__`(誕生の儀式=初期化)です。他にも `__str__`(自己紹介)や `__eq__`(他者との比較)などがあります。これらを実装することで、自作クラスがPythonの組み込み型と同じように自然に振る舞えるようになります。
class Vector: def __init__(self, x, y): # コンストラクタ self.x = x self.y = y
def __repr__(self): # 開発者向け文字列 return f"Vector({self.x}, {self.y})"
def __str__(self): # ユーザー向け文字列 return f"({self.x}, {self.y})"
def __add__(self, other): # + 演算子 return Vector(self.x + other.x, self.y + other.y)
def __eq__(self, other): # == 演算子 return self.x == other.x and self.y == other.y
v1 = Vector(1, 2)v2 = Vector(3, 4)v3 = v1 + v2 # Vector(4, 6)Bad
# ❌ Bad: メソッドを直接呼ぶv1.add(v2)v1.equals(v2)Good
# ✅ Good: 演算子オーバーロードv1 + v2 # __add__v1 == v2 # __eq__パターン
# よく使うマジックメソッド__len__ # len(obj)__getitem__ # obj[key]__setitem__ # obj[key] = value__iter__ # for x in obj__next__ # next(obj)__call__ # obj()__contains__ # item in obj
# コンテキストマネージャclass Timer: def __enter__(self): self.start = time.time() return self
def __exit__(self, exc_type, exc_val, exc_tb): print(f"Elapsed: {time.time() - self.start:.2f}s") return False
with Timer(): # 処理
# ハッシュ可能にするdef __hash__(self): return hash((self.x, self.y)) Tip: __repr__ は開発用、__str__ はユーザー用。迷ったら __repr__ を先に。
合格ライン
__init__, __repr__, __str__ を書ける
__add__, __eq__ を実装できる
演習課題
課題1: __repr__/__str__
__repr__ と __str__ を実装してください。
課題2: __eq__
__eq__ で等価比較を実装してください。