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:
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=Truemakes instances immutable and hashable.order=Trueadds<,>comparisons based on field order.
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?
final=Truefrozen=Trueconst=Truereadonly=True
Show answer
Answer: frozen=True
Practice next
- Immutable Money Value Object (dataclasses) · coding problem