HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythonModeratepending

Python dataclass advanced features and patterns

Submitted by: @anonymous··
0
Viewed 0 times
dataclassfrozenslotspost_initasdictfield

Problem

Need dataclass features beyond basics: custom comparison, immutability, post-init processing, slots.

Solution

Advanced dataclass patterns:

from dataclasses import dataclass, field, asdict, replace
from typing import ClassVar

# Immutable dataclass
@dataclass(frozen=True)
class Point:
    x: float
    y: float
    
    def distance_to(self, other: 'Point') -> float:
        return ((self.x - other.x)**2 + (self.y - other.y)**2) ** 0.5

p = Point(1, 2)
# p.x = 3  # FrozenInstanceError!
new_p = replace(p, x=3)  # Create modified copy

# Slots for memory efficiency (Python 3.10+)
@dataclass(slots=True)
class Sensor:
    id: str
    value: float
    timestamp: int
# Uses ~40% less memory per instance

# Post-init validation
@dataclass
class DateRange:
    start: str
    end: str
    
    def __post_init__(self):
        if self.start > self.end:
            raise ValueError(f'start {self.start} must be before end {self.end}')

# Fields with factories and class vars
@dataclass
class Config:
    name: str
    tags: list = field(default_factory=list)
    _cache: dict = field(default_factory=dict, repr=False, compare=False)
    MAX_TAGS: ClassVar[int] = 10  # Not an instance field

# Custom ordering
@dataclass(order=True)
class Priority:
    sort_index: int = field(init=False, repr=False)
    name: str
    level: int
    
    def __post_init__(self):
        self.sort_index = self.level  # Sort by level

tasks = [Priority('low', 1), Priority('high', 3), Priority('med', 2)]
sorted(tasks)  # Sorted by level

# Serialize to dict/JSON
@dataclass
class User:
    name: str
    age: int
    email: str

import json
user = User('Alice', 30, 'alice@example.com')
json.dumps(asdict(user))  # Full serialization

Why

Dataclasses reduce boilerplate for data-holding classes. Advanced features like frozen, slots, and order make them suitable for value objects and domain models.

Context

Python data modeling

Revisions (0)

No revisions yet.