카테고리 없음

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__ 메서드를 직접 작성해야 합니다.

반응형