Python - Dataclasses
Overview
Estimated time: 25–35 minutes
@dataclass reduces boilerplate for classes that primarily store data. Learn fields, defaults, immutability (frozen=True), ordering, and common patterns.
Learning Objectives
- Define dataclasses with type hints and default values.
- Use
field()for defaults and factories; control comparison and hashing. - Understand immutability (
frozen) and slots for performance (slots=True, 3.10+).
Prerequisites
- Basic classes and type hints
Examples
from dataclasses import dataclass, field
from typing import List
@dataclass
class User:
id: int
name: str
tags: List[str] = field(default_factory=list)
u = User(1, "Ada")
u.tags.append("admin")
print(u)
Expected Output (repr may vary):
User(id=1, name='Ada', tags=['admin'])
Common Pitfalls
- Using a mutable default directly (e.g.,
tags=[])—usedefault_factory=listinstead. - Assuming
frozen=Trueprevents mutation of contained mutable fields—it prevents attribute rebinding, not deep immutability. - Ordering and hashing depend on configuration; be explicit about
eq,order, andunsafe_hashneeds.
Best Practices
- Use dataclasses for simple domain objects and configuration; consider Pydantic for validation-heavy models.
- Prefer
slots=Truefor large numbers of instances to save memory. - Expose
asdict()andastuple()for serialization; avoid for very large graphs due to recursion/copy cost.
Checks for Understanding
- How do you set a list field with an empty list default correctly?
- What does
frozen=Trueactually prevent?
Show answers
field(default_factory=list)- Rebinding attributes on the instance; it does not make nested objects immutable.
Exercises
- Create an immutable dataclass with ordering for
Point(x, y). Show sorting behavior. - Profile memory of a dataclass with and without
slots=Truefor many instances.