Post

Python DataClass 데코레이터 알아보기

Python DataClass 데코레이터 알아보기

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

개요

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

pep

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

매개 변수

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

1
@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: 읽기 전용 고정 인스턴스

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

기존

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

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

데이터클래스 데코레이터

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

dataclasses 패키지를 가져옵니다.

1
from typing import List

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

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

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

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

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

1
p = User("Kim", True)

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

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

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

1
2
print(type(p))
print(type(asdict(p)))

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

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

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

1
2
print(type(p))
print(type(astuple(p)))

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

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

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

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

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

This post is licensed under CC BY 4.0 by the author.