Python Dataclasses — Modern Class Syntax
Dataclasses reduce boilerplate for classes that primarily store data. They auto-generate __init__, __repr__, __eq__, and more.
Learning Objectives
- Create dataclasses with @dataclass decorator
- Use field() for custom defaults and options
- Create frozen (immutable) dataclasses
- Use post_init for computed fields
Basic Dataclass
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
p = Point(3.0, 4.0)
print(p) # Point(x=3.0, y=4.0)
print(p.x, p.y) # 3.0 4.0
print(p == Point(3.0, 4.0)) # True
field() Options
from dataclasses import dataclass, field
from typing import List
@dataclass
class Student:
name: str
age: int
grades: List[float] = field(default_factory=list)
gpa: float = field(init=False)
def __post_init__(self):
if self.grades:
self.gpa = sum(self.grades) / len(self.grades)
else:
self.gpa = 0.0
s = Student("Alice", 20, [3.5, 4.0, 3.8])
print(s.gpa) # 3.766...
Frozen Dataclass
@dataclass(frozen=True)
class Config:
host: str = "localhost"
port: int = 8080
config = Config()
# config.port = 9000 # AttributeError: frozen
# Hashable — can be dict key or set element
configs = {Config(): "default"}
Inheritance
@dataclass
class Animal:
name: str
species: str
@dataclass
class Pet(Animal):
owner: str
vaccinated: bool = True
pet = Pet("Rex", "Dog", "Alice")
print(pet) # Pet(name='Rex', species='Dog', owner='Alice', vaccinated=True)
Key Takeaways
@dataclassauto-generates__init__,__repr__,__eq__- Use
field()for mutable defaults and custom options frozen=Truefor immutable instances__post_init__for computed fields- Use
default_factoryfor mutable default values