PHpullh
학습 라이브러리/Python/dataclass 심화 (field, post_init)

PYTHON · 객체지향

dataclass 심화 (field, post_init)

dataclassfield(), __post_init__, 상속 등 고급 기능을 다룹니다.

객체지향중급dataclassfieldpost_initfrozen

핵심 설명

dataclassfield(), __post_init__, 상속 등 고급 기능을 다룹니다.

Python code

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

@dataclass
class User:
    name: str
    age: int
    tags: list[str] = field(default_factory=list)
    _id: int = field(init=False, repr=False)
    count: ClassVar[int] = 0  # 클래스 변수 (인스턴스 필드 아님)

    def __post_init__(self):
        User.count += 1
        self._id = User.count
        if self.age < 0:
            raise ValueError("나이는 0 이상이어야 합니다")

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

    @property
    def distance(self) -> float:
        return (self.x ** 2 + self.y ** 2) ** 0.5

# 사용
u1 = User("Alice", 30, ["admin"])
u2 = User("Bob", 25)
print(u1)   # User(name='Alice', age=30, tags=['admin'])
print(asdict(u2))  # {'name': 'Bob', 'age': 25, 'tags': []}

p = Point(3, 4)
print(f"거리: {p.distance}")  # 5.0
# p.x = 10  # FrozenInstanceError

학습 팁

mutable 기본값(리스트, 딕셔너리)은 반드시 field(default_factory=list)로 선언하세요.

주의할 점

dataclass에서 기본값이 없는 필드 뒤에 기본값이 있는 필드를 선언하면 TypeError가 발생합니다.

자주 묻는 질문

dataclass 심화 (field, post_init)란 무엇인가요?

dataclass 의 field() , __post_init__ , 상속 등 고급 기능을 다룹니다.

dataclass 심화 (field, post_init) 학습 시 주의할 점은 무엇인가요?

dataclass 에서 기본값이 없는 필드 뒤에 기본값이 있는 필드를 선언하면 TypeError 가 발생합니다.