The before code shows a mutable UserProfile object that can be changed by any part, risking inconsistent state. The after code uses a frozen dataclass to make UserProfile immutable. Updates create new copies with changes, ensuring safety and predictability.
### Before (mutable shared state, unsafe)
class UserProfile:
def __init__(self, name, age):
self.name = name
self.age = age
profile = UserProfile("Alice", 30)
# Multiple parts modify the same object
profile.age += 1 # Part A
profile.name = "Alicia" # Part B
### After (immutable data, safe)
from dataclasses import dataclass, replace
@dataclass(frozen=True)
class UserProfile:
name: str
age: int
profile = UserProfile("Alice", 30)
# To update, create a new object
new_profile = replace(profile, age=profile.age + 1)
newer_profile = replace(new_profile, name="Alicia")