데이터만 묶는 클래스에 생성자, 표현, 비교를 반복해서 쓰지 않도록 `dataclasses`가 코드를 만든다.

from dataclasses import dataclass, field

@dataclass(frozen=True, slots=True)
class Pos:
    file: int
    rank: int
    tags: tuple[str, ...] = field(default_factory=tuple)

`frozen=True`는 일반 대입을 막아 값 객체에 어울린다. 완전한 불변 보안은 아니다. `slots=True`는 인스턴스의 임의 속성 추가를 막고 많은 작은 객체의 메모리를 줄일 수 있다.

`__repr__`, `__eq__`, `__hash__` 같은 특별 메서드는 Python 데이터 모델과 연결된다. 해시 가능한 객체는 비교가 같은 동안 해시도 같아야 한다. 변경 가능한 필드를 가진 객체를 dict 키로 만들지 않는다.

검증과 복잡한 불변식이 핵심이라면 dataclass가 모든 것을 대신하지 않는다. `__post_init__`에서 검사하거나 명시적인 클래스로 계약을 드러낸다.

Python 14. dataclass와 데이터 모델의 핵심 흐름도
그림. dataclass는 데이터 타입의 반복 코드를 생성하고 의도를 남긴다.