← Python lessons

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)

Practise this in the free Python course, where every exercise checks your code instantly.