Skip to main content

Python Dataclasses

OOP Modern Tools

Dataclasses

`@dataclass` reduces boilerplate for classes that primarily store data.

Definition

from dataclasses import dataclass, field
from datetime import datetime, timezone

@dataclass
class Invoice:
total: float
customer: str
created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
  • Generates __init__, __repr__, __eq__ automatically.
  • Use field(default_factory=...) for mutable defaults.

Advanced options

  • frozen=True -> immutable instances.
  • slots=True (Python 3.10+) -> reduces memory usage.
  • kw_only=True -> keyword-only init parameters.

Post-init processing

Use __post_init__ for validation or derived fields:

@dataclass
class Order:
quantity: int
unit_price: float
total: float = field(init=False)

def __post_init__(self):
if self.quantity <= 0:
raise ValueError("quantity must be positive")
self.total = self.quantity * self.unit_price

Next up in your learning path