Python DataClass 데코레이터 알아보기

오늘은 Python에서 데이터 클래스를 구성하게 해주는 DataClass 데코레이터에 대하여 알아보려 합니다.

개요

데이터를 저장하기 위한 클래스를 데이터 클래스라고 하며, 이를 파이썬 3.7부터 데코레이터로 지원합니다.

pep

https://www.python.org/dev/peps/pep-0557/

매개 변수

dataclass 데코레이터의 매개 변수는 아래와 같이 기본적으로 설정되어 있습니다.

@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
  • init: __init__ 메서드

기본적으로 __init__ 메서드가 생성됩니다.

  • repr: __repr__ 메서드

기본적으로 __repr__ 메서드가 생성됩니다.

  • eq: __eq__ 메서드

기본적으로 __eq__ 메서드가 생성됩니다.

  • order: __lt__, __le__, __gt__, __ge__ 메서드

기본적으로 생성되지 않습니다.

  • unsafe_hash: __hash__ 메서드

기본적으로 생성되지 않습니다.

  • frozen: 읽기 전용 고정 인스턴스

기본적으로는 필드에 값을 넣어도 됩니다.

기존

class User:
    def __init__(self):
        self.name = ""
        self.agree = True
        self.tag = []
    def __getitem__(self, idx):
        return self.tag[idx]

기존에는 __init__ 메소드로 필드를 구성했습니다.

데이터클래스 데코레이터

from dataclasses import dataclass, field, asdict, astuple, make_dataclass

dataclasses 패키지를 가져옵니다.

from typing import List

typing 패키지로 리스트를 타입 힌트에 활용하게 합니다.

@dataclass
class User:
    name: str = ""
    agree: bool = True
    tag: List[str] = field(default_factory=list)

User라는 데이터 클래스를 만듭니다.

해당 코드에서는 name, agree, tag 필드로 이루어져 있습니다.

가변적인 기본값을 가진 리스트는 field로 대입합니다.

p = User("Kim", True)

User 데이터 클래스로 객체를 생성했습니다.

print(asdict(p))
assert asdict(p) == {'name': "Kim", 'agree': True,'tag': []}

dict 타입으로 변경할 수 있습니다.

print(type(p))
print(type(asdict(p)))

타입을 비교해보면 __main__.User과 dict임을 알 수 있습니다.

print(astuple(p))
assert astuple(p) == ("Kim", True, [])

tuple 타입으로 변경할 수 있습니다.

print(type(p))
print(type(astuple(p)))

타입을 비교해보면 __main__.User과 tuple임을 알 수 있습니다.

Article = make_dataclass('article',
                   [('title', str),
                    ('text', str),
                    ('index', int, field(default=5))])

클래스 이름과 필드를 순서대로 적으면 데이터 클래스를 만들 수 있습니다.

a = Article("title","text",1)
print(a)
print(asdict(a))
print(astuple(a))

Article 데이터 클래스로 객체를 생성하고 dict 타입 또는 tuple 타입으로 변경할 수 있습니다.

Written on April 5, 2019