Python dataclass

mmmn0616·2026년 8월 18일

dataclass: 클래스를 만들 때 init, repr, eq 같은 반복적인 코드를 자동으로 작성해 주는 편리한 데코레이터

문제 - 클래스 정의할 때(특수 메서드)

일반적으로 클래스를 만들 때 주로 사용하는 메서드는 이 세 가지 이다.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age})"

    def __eq__(self, other):
        return self.name == other.name and self.age == other.age

그냥 파이썬의 class 문법으로 코드를 짜게 되면, 이 기능들을 직접 하나하나 정의해줘야 한다.

__init__

def __init__(self, name, age):
    self.name = name
    self.age = age

객체를 생성할 때 self의 필드를 일일이 설정해줘야 한다.

__repr__

def __repr__(self):
    return f"Person(name={self.name}, age={self.age})"

객체를 출력할 때 우리가 원하는 형태로 예쁘게 출력되지 않는다. 객체를 어떤 형식으로 보여줄지도 이런식으로 직접 지정해줘야 한다.

__eq__

def __eq__(self, other):
    return self.name == other.name and self.age == other.age

두 객체를 비교할 때 어떤 경우에 같다고 판단할지도 정해야한다.

__init__, __repr__, __eq__ 같은 특수 메서드(Special Method) (또는 매직 메서드(Magic Method))는 클래스 정의 시점에 직접 작성해야 하는데, dataclass를 사용하면 이걸 자동으로 만들어주어 편리하다.

해결 - @dataclass

from dataclasses import dataclass

@dataclass
class Person:
    name: str
    age: int

이렇게만 작성해도 dataclass가 기본적으로 __init__, __repr__, __eq__ 메서드를 자동으로 만들어준다.

단순히 데이터를 저장하는 목적의 클래스를 만드는 경우, dataclass를 사용하면 반복되는 코드를 많이 줄일 수 있다.

추가. frozen=True

클래스를 만든 뒤 그 속성을 바꾸지 않을 계획이라면 frozen=True 옵션을 사용할 수 있다.

@dataclass(frozen=True)
class Person:
    name: str
    age: int

이렇게 하면 객체를 생성한 이후 속성을 수정할 수 없고, 수정을 시도하게 되면 에러가 발생한다.

person = Person("Kim", 20)

person.age = 21
# FrozenInstanceError

0개의 댓글