카테고리 없음
Python @dataclass 데코레이터
aimler
2025. 9. 30. 23:01
반응형
@dataclass 는 데이터 전용 클래스를 쉽게 만들 수 있도록 도와주는 데코레이터입니다.
보통 우리가 단순히 데이터를 담는 용도로 클래스를 정의할 때는 __init__, __repr__, __eq__ 같은 메서드를 일일이 작성해야 했습니다. 하지만 @dataclass를 사용하면 이런 메서드를 자동 생성해 줍니다.
> 기본 개념
from dataclasses import dataclass
@dataclass
class User:
id: int
name: str
active: bool = True
이렇게 작성하면 파이썬이 자동으로 다음을 생성합니다:
- __init__ → User(id, name, active) 자동 정의
- __repr__ → User(id=1, name='Alice', active=True) 형태의 문자열 반환
- __eq__ → 객체끼리 값 비교 가능 (== 연산자)
> 사용 예시
user1 = User(1, "Alice")
user2 = User(2, "Bob", False)
print(user1) # User(id=1, name='Alice', active=True)
print(user2) # User(id=2, name='Bob', active=False)
print(user1 == User(1, "Alice")) # True (값 비교)
> 주요 옵션
@dataclass 데코레이터는 여러 인자를 가질 수 있습니다:
- frozen=True
→ 불변 객체(immutable)로 만듦 (값 변경 불가, dataclass 버전의 namedtuple 느낌) - eq=True/False
→ __eq__ 자동 생성 여부 - order=True
→ <, >, <=, >= 비교 연산 지원 - init=True/False
→ __init__ 생성 여부
> 예시
@dataclass(frozen=True, order=True)
class Point:
x: int
y: int
p1 = Point(1, 2)
p2 = Point(2, 3)
print(p1 < p2) # True (order=True 덕분에 지원)
# p1.x = 10 # 에러 발생 (frozen=True 덕분에 불변 객체)
> field() 활용
필드별로 세부 설정도 가능합니다.
from dataclasses import dataclass, field
@dataclass
class Product:
name: str
price: float
tags: list[str] = field(default_factory=list) # 리스트는 반드시 default_factory 사용
이렇게 하면 각 인스턴스가 서로 다른 리스트 객체를 가지게 됩니다.
(default=[]로 쓰면 모든 인스턴스가 같은 리스트 공유 → 버그 발생 위험)
------------------------------------------------- 일반 클래스와 비교 -------------------------------------------------
> 일반 클래스 구현
class User:
def __init__(self, id: int, name: str, active: bool = True):
self.id = id
self.name = name
self.active = active
def __repr__(self):
return f"User(id={self.id!r}, name={self.name!r}, active={self.active!r})"
def __eq__(self, other):
if isinstance(other, User):
return (self.id, self.name, self.active) == (other.id, other.name, other.active)
return False
# 사용 예시
u1 = User(1, "Alice")
u2 = User(1, "Alice")
print(u1) # User(id=1, name='Alice', active=True)
print(u1 == u2) # True
일반 클래스는 __init__, __repr__, __eq__ 메서드를 직접 작성해야 합니다.
반응형