Python Dataclasses: @dataclass, Defaults and Free Methods
A Python dataclass uses @dataclass to generate methods for a class that holds data. You declare fields with type hints instead of writing repeated setup code.
Read Classes and objects and Type hints first.
Create a dataclass
Import dataclass and place @dataclass above your class. It generates __init__(), __repr__() and __eq__() by default.
from dataclasses import dataclass
@dataclass
class Player:
name: str
score: int
player = Player("Ada", 12)
print(player)
print(player == Player("Ada", 12))
The generated display is Player(name='Ada', score=12). Equal field values in the same class compare as True.
Give fields defaults
Put required fields before fields with defaults. You can override a default when creating an instance.
from dataclasses import dataclass
@dataclass
class Player:
name: str
score: int = 0
print(Player("Ada"))
print(Player("Bo", score=10))
Ada starts with 0; Bo starts with 10.
Use default_factory for lists
Use field(default_factory=list) for a new list per instance. A list literal as a field default is rejected.
from dataclasses import dataclass, field
@dataclass
class Team:
name: str
players: list[str] = field(default_factory=list)
red = Team("Red")
blue = Team("Blue")
red.players.append("Ada")
print(red.players)
print(blue.players)
Red has ['Ada']; Blue still has []. Their lists are separate.
Note: Type hints do not validate values at runtime. Dataclasses do not generate ordering comparisons such as < unless you request order=True.
See also: Methods and self, Decorators.
Your turn
Create a Book named Dune using the default page count, then print it.
from dataclasses import dataclass
@dataclass
class Book:
title: str
pages: int = 0
# add two lines: create book with title Dune, then print book
Expected output
Book(title='Dune', pages=0)