Python Tutorial · Object-Oriented Python · Lesson 29 of 42

Python Dataclasses

Write data-holding classes with less boilerplate using @dataclass.

@dataclass

@dataclass generates __init__, __repr__ and __eq__ from type-annotated fields:

Example 1Try it yourself
from dataclasses import dataclass

@dataclass
class User:
    name: str
    email: str
    active: bool = True

u = User("Ada", "[email protected]")
print(u)
print(u == User("Ada", "[email protected]"))

Output

User(name='Ada', email='[email protected]', active=True)
True

Defaults, immutability and ordering

  • Give fields default values (use field(default_factory=list) for mutable defaults).
  • frozen=True makes instances immutable and hashable.
  • order=True adds <, > comparisons based on field order.
Example 2Try it yourself
from dataclasses import dataclass, field

@dataclass(frozen=True, order=True)
class Version:
    major: int
    minor: int

@dataclass
class Cart:
    items: list = field(default_factory=list)

print(sorted([Version(2, 0), Version(1, 9), Version(1, 10)]))
cart = Cart()
cart.items.append("book")
print(cart)

Output

[Version(major=1, minor=9), Version(major=1, minor=10), Version(major=2, minor=0)]
Cart(items=['book'])

Dataclasses are ideal for value objects and records: API payloads, configuration, coordinates, money.

Test yourself

Which option makes dataclass instances immutable?

  1. final=True
  2. frozen=True
  3. const=True
  4. readonly=True
Show answer

Answer: frozen=True

Practice next