Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python 데이터클래스(dataclass) 완벽 가이드: 자동 생성 마법 메서드부터 유틸리티 함수까지

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 모듈은 보일러플레이트 코드를 제거하고 데이터 중심 클래스를 간결하게 작성할 수 있게 해 주는 강력한 도구입니다.