PYTHON

Python Data Class: Syntax, Usage, and Examples

A Python data class simplifies how you create classes for storing data. Instead of writing repetitive boilerplate code for attributes, constructors, and methods like __repr__, you can declare a class using the @dataclass decorator, and Python will automatically generate much of that code for you.

The dataclasses module, introduced in Python 3.7, is especially useful when working with structured data. A data class Python object looks like a regular class but behaves more like a lightweight record or struct. This approach is perfect for configuration containers, data transfer objects, or any context where class instances mostly store values.


What Makes a Class a Python Data Class?

You define a data class by applying the @dataclass decorator to a regular class. The decorator automatically generates an __init__() method, __repr__(), __eq__(), and other special methods based on the class attributes.

from dataclasses import dataclass

@dataclass
class Book:
    title: str
    author: str
    pages: int

This short declaration is enough to create a fully functioning object with attribute assignment, comparison support, and meaningful string representation.


Why Use Data Classes?

Using a Python data class helps you:

  • Reduce boilerplate code
  • Create immutable or mutable data structures
  • Improve readability of code
  • Enable easy comparisons and conversions
  • Enhance debugging with automatic __repr__

Instead of writing verbose class definitions for every data object, you let Python handle the repetitive tasks for you.


Creating a Basic Data Class in Python

Here’s how a minimal data class looks:

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

You can now create instances:

john = Person(name="John", age=30)
print(john)

This prints:

Person(name='John', age=30)

Python automatically adds a clean __repr__() method for quick inspection.


Adding Default Values

You can assign default values to fields directly in the class definition:

@dataclass
class Article:
    title: str
    published: bool = False

Creating an instance without the published field uses the default:

post = Article(title="Guide to Python")
print(post.published)  # False

Default values in a python data class reduce the need for manual validation and conditionals later in your code.


Using field() for More Control

If you want to customize individual fields—like making them immutable or setting factory defaults—you can use the field() function from the dataclasses module:

from dataclasses import dataclass, field

@dataclass
class Settings:
    options: list = field(default_factory=list)

This ensures each instance of Settings gets a fresh list instead of sharing the same list object across instances.


Converting a Python Data Class to Dict or JSON

One useful feature of Python data classes is their compatibility with asdict() and json.dumps():

from dataclasses import asdict
import json

@dataclass
class Product:
    name: str
    price: float

item = Product("Mouse", 29.99)
print(asdict(item))
print(json.dumps(asdict(item)))

The ability to convert a python data class to dict or JSON makes it easy to integrate with APIs, configuration files, or other serialization systems.


Data Class Inheritance

Python supports inheritance with data classes. You can build upon base data structures to avoid repeating attributes:

@dataclass
class Vehicle:
    make: str
    model: str

@dataclass
class Car(Vehicle):
    doors: int

Creating a Car object includes both parent and child fields:

car = Car("Toyota", "Corolla", 4)
print(car)

Python data class inheritance works seamlessly, allowing modular class hierarchies without boilerplate.


Frozen Data Classes

By using frozen=True, you can make data class instances immutable:

@dataclass(frozen=True)
class Point:
    x: float
    y: float

Attempting to change an attribute raises an error:

p = Point(1.0, 2.0)
p.x = 10.0  # Raises dataclasses.FrozenInstanceError

This pattern is useful in contexts where object state should never change, such as in caching systems or hash-based containers.


Comparing Data Classes

Data class objects can be compared directly using ==:

@dataclass
class Rectangle:
    width: int
    height: int

r1 = Rectangle(10, 20)
r2 = Rectangle(10, 20)
print(r1 == r2)  # True

Behind the scenes, Python generates a full __eq__() method based on the fields.


Python Data Class Example with More Features

Here's a more advanced example of a data class Python might use in a finance app:

from dataclasses import dataclass, field
from datetime import datetime

@dataclass
class Invoice:
    id: int
    customer: str
    amount: float
    created_at: datetime = field(default_factory=datetime.now)
    paid: bool = False

This shows how to combine field factories, default values, and types for real-world applications.


Post-Initialization Logic

Use __post_init__() to run custom logic after instance creation:

@dataclass
class Circle:
    radius: float
    area: float = field(init=False)

    def __post_init__(self):
        self.area = 3.14 * self.radius ** 2

Now the area field is calculated based on radius after the object is created, and doesn't need to be passed manually.


Type Checking and Static Analysis

By specifying types in the class definition, you allow static type checkers like mypy to validate your code. It also improves editor autocomplete and documentation generation.

This is particularly helpful in larger codebases or teams where clarity and maintainability are essential.


Converting Regular Classes to Data Classes

Here’s a quick comparison:

Regular class:

class User:
    def __init__(self, name, active=True):
        self.name = name
        self.active = active

Data class alternative:

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

The second version is shorter, easier to read, and automatically gets string, equality, and other methods.


Combining Data Classes and Type Hints

Because data classes use type annotations, you can also combine them with tools like:

  • pydantic (for validation)
  • attrs (as an alternative with more flexibility)
  • dataclasses_json (for seamless JSON integration)

This allows you to use python data classes example-driven in both fast prototyping and strict production environments.


Limitations of Data Classes

While data classes are powerful, they’re not ideal for:

  • Complex inheritance chains involving method overrides
  • Classes with dynamic attributes or behaviors
  • Classes where you need metaclass-level control

Stick to using them for clean, declarative data containers.


Python data classes help you create cleaner, more maintainable classes for structured data. They eliminate boilerplate by generating standard methods, make type checking easy, support default values, offer JSON and dictionary conversions, and simplify inheritance and immutability.

Learn to Code in Python for Free
Start learning now
button icon
To advance beyond this tutorial and learn Python by doing, try the interactive experience of Mimo. Whether you're starting from scratch or brushing up your coding skills, Mimo helps you take your coding journey above and beyond.

Sign up or download Mimo from the App Store or Google Play to enhance your programming skills and prepare for a career in tech.

You can code, too.

© 2025 Mimo GmbH

Reach your coding goals faster