PYTHON · 객체지향
dataclass 심화 (field, post_init)
dataclass의 field(), __post_init__, 상속 등 고급 기능을 다룹니다.
객체지향중급dataclassfieldpost_initfrozen
핵심 설명
dataclass의 field(), __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 가 발생합니다.