patternpythonModeratepending
Python dataclass advanced features and patterns
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 serializationWhy
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.