dataclasses 모듈은 Python 3.7부터 표준 라이브러리에 추가된 기능으로, 사용자가 정의한 클래스에 대해 생성자 역할을 하는 __init__(), 객체의 문자열 표현을 담당하는 __repr__(), 그리고 == 연산자를 오버로딩하는 __eq__() 등의 마법 메서드를 자동으로 생성해 주는 @dataclass 데코레이터를 제공합니다.
덕분에 단순히 데이터를 담는 용도의 클래스를 만들 때 반복적인 코드를 크게 줄일 수 있습니다.
dataclass 데코레이터의 시그니처
@dataclass 데코레이터는 다음과 같은 형태로 정의되어 있습니다.
dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
모든 인자는 불리언(Boolean) 값을 받으며, 해당 값이 True일 경우 관련된 마법 메서드가 자동으로 생성됩니다.
init
기본값은 True이며, 클래스에 대한 __init__() 메서드를 자동 생성합니다.
repr
기본값은 True이며, 객체의 공식적인 문자열 표현을 반환하는 __repr__() 메서드를 자동 생성합니다.
eq
기본값은 True이며, == 비교 연산자에 반응하는 __eq__() 메서드를 자동 생성합니다.
order
기본값은 False입니다. True로 설정하면 비교 연산자를 구현하는 __lt__(), __le__(), __gt__(), __ge__() 메서드가 자동 생성됩니다. 각각 <, <=, >, >= 연산자에 대응합니다. 참고로 order=True인데 eq=False인 경우 ValueError가 발생하며, 이미 이 메서드들이 정의되어 있는 클래스에 적용하면 TypeError가 발생합니다.
unsafe_hash
기본값은 False입니다. False인 경우 eq와 frozen 설정 값에 따라 __hash__() 메서드의 생성 여부가 결정됩니다.
frozen
기본값은 False입니다. True로 설정하면 읽기 전용(변경 불가능)인 frozen 인스턴스처럼 동작합니다.
Student 클래스 예제
dataclass 데코레이터를 사용해 Student 클래스를 다음과 같이 정의할 수 있습니다.
from dataclasses import dataclass
@dataclass
class Student(object):
name : str
age : int
percent : float위 코드에서 자동 생성되는 __init__() 메서드는 다음과 같습니다.
def __init__(self, name: str, age: int, percent: float):
self.name = name
self.age = age
self.percent = percent만약 클래스 내부에 __init__(), __repr__(), __eq__() 메서드가 명시적으로 정의되어 있다면, 해당 매개변수(init, repr, eq)는 무시됩니다.
실제로 두 개의 Student 인스턴스를 생성하고 비교해 보면 다음과 같습니다.
>>> from data_class import Student
>>> s1 = Student('Naveen', 21, 50.50)
>>> s2 = Student('Mangesh', 20, 50.00)
>>> s1 == s2
False주요 유틸리티 함수
asdict() – 딕셔너리 변환
클래스 인스턴스를 딕셔너리(dict) 객체로 변환합니다.
>>> import dataclasses
>>> dataclasses.asdict(s1)
{'name': 'Naveen', 'age': 21, 'percent': 50.5}astuple() – 튜플 변환
클래스 인스턴스를 튜플(tuple) 객체로 변환합니다.
>>> dataclasses.astuple(s2)
('Mahesh', 20, 50.0)make_dataclass() – 동적 데이터클래스 생성
필드(fields) 목록을 인자로 전달하여 새로운 데이터클래스를 동적으로 생성합니다.
>>> NewClass = dataclasses.make_dataclass('NewClass', [('x', int), ('y', float)])
>>> n = NewClass(10, 20)
>>> n
NewClass(x=10, y=20)이처럼 Python의 dataclasses 모듈은 보일러플레이트 코드를 제거하고 데이터 중심 클래스를 간결하게 작성할 수 있게 해 주는 강력한 도구입니다.