4-3
可変インスタンスの使い回しが生む事故
書き換え可能なオブジェクトを複数の持ち主で共有すると、片方への変更がもう片方にも波及する。コード上は別々の持ち主に見えるのに実体は同じ1個、という状態は、変更した本人にも気づけない遠隔バグになる。少なくとも持ち主ごとに別インスタンスを生成して共有を断つ。
部門予算インスタンスの共有
✕ Bad
class Budget:
def __init__(self, amount: int) -> None:
self.amount = amount
class Department:
def __init__(self, name: str, budget: Budget) -> None:
self.name = name
self.budget = budget
shared = Budget(1_000_000)
sales = Department("営業部", shared)
admin = Department("管理部", shared)
sales.budget.amount += 200_000 # 営業部だけ増額したつもり
print(admin.budget.amount) # 1_200_000 — 管理部まで増えている✓ Good
sales = Department("営業部", Budget(1_000_000))
admin = Department("管理部", Budget(1_000_000))
sales.budget.amount += 200_000
print(admin.budget.amount) # 1_000_000 のままインスタンスを分けても Budget 自体はまだ可変で、どこからでも amount を書き換えられる構造は残っている。共有を断つのは応急処置で、根本対策はトピック4・5で扱う「不変にする」こと。