マジックメソッド: Pythonic なクラス

__xxx__ で演算子や組み込み関数をカスタマイズ。

マジックメソッド
__xxx__ 形式の特殊メソッド。
ダンダー
double-underscore の略。
演算子オーバーロード
+, ==, [] などをカスタマイズ。

マジックメソッド

隠された魔法の呪文 (Hidden Magic Spells)

マジックメソッドは、オブジェクトに特別な力を与える「魔法の呪文」です。名前が `__`(ダブルアンダースコア)で囲まれています。例えば `__add__` という呪文を唱えておけば(定義しておけば)、そのオブジェクトは `+` 記号で足し算ができるようになります。Pythonの便利な構文(len, in, forなど)は全てこの魔法で動いています。

最も有名な呪文は `__init__`(誕生の儀式=初期化)です。他にも `__str__`(自己紹介)や `__eq__`(他者との比較)などがあります。これらを実装することで、自作クラスがPythonの組み込み型と同じように自然に振る舞えるようになります。

Vector Class
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__

パターン

Common Magic Methods
# よく使うマジックメソッド
__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__ で等価比較を実装してください。