본문 바로가기
Python

[Python] Data Classes

by llHoYall 2023. 2. 20.

이 모듈은 C언어나 Go언어의 struct와 유사하게 class를 data type처럼 사용할 수 있도록 도와줍니다.

dataclass Decorator

from dataclasses import dataclass

@dataclass
class Vector:
    x: int
    y: int

vector = Vector(1, 2)
print(vector)  # Vector(x=1, y=2)

@dataclass decorator를 사용하여 class를 정의하면 Data Class가 됩니다.

Data Class는 __init__() 혹은 __repr__()와 같은 special methods를 자동으로 정의해 줍니다.

또한, 다음의 parameter들을 명시적으로 넣어줄 수 있습니다.

  • init : True일 경우, __init__() method가 생성되며 기본 값으로 설정되어 있습니다.
  • repr : True일 경우, __repr__() method가 생성되며 기본 값으로 설정되어 있습니다.
  • eq : True일 경우, __eq__() method가 생성되며 기본 값으로 설정되어 있습니다.
  • order : True일 경우, __lt__(), __le__(), __gt__(), __ge__() methods가 생성되며 기본 값은 False 입니다.
  • unsafe_hash : False일 경우, eq와 frozen의 설정 방식에 따라 __hash__() method가 생성되며 기본 값으로 설정되어 있습니다.
  • frozen : True일 경우, 상수처럼 사용됩니다. 기본 값은 False 입니다.
  • match_args : True일 경우, __match_args__가 생성되며 기본 값으로 설정되어 있습니다. False이거나 이미 __match_args__가 정의되어 있다면 생성되지 않습니다.
  • kw_only : True일 경우, 모든 fields가 keyword-only로 표시됩니다. 기본 값은 False 입니다.
  • slots : True일 경우, __slots__ attribute가 생성되고 새 class가 반환됩니다. 기본 값은 False 입니다.
  • weakref_slot : True일 경우, __weakref_slot__을 추가합니다. 따라서, slots가 True로 함께 설정되어야만 합니다. 기본 값은 False 입니다.

사용 예를 보여드리면, 다음과 같습니다.

from dataclasses import dataclass

@dataclass(frozen=True, order=True)
class Vector:
    x: int
    y: int

vector1 = Vector(1, 2)
# vector1.x = 3  # Error!
vector2 = Vector(2, 2)

print(vector1 == vector2)  # False
print(vector1 < vector2)  # True

field() Function

기본적인 사용은 위에서 설명드린 내용으로 충분할 것이라 생각합니다.

이 함수는 추가적으로 각각의 property에 대해 보다 세세한 설정을 할 수 있게 도와줍니다.

from dataclasses import dataclass, field

@dataclass
class Vector:
    x: int = field(default=0)
    y: int = field(default=0)

vector = Vector(1)
print(vector)  # Vector(x=1, y=0)

위의 예를 보면 추가로 기본 값을 설정할 수 있습니다.

가능한 parameter들을 살펴보겠습니다.

  • default : 기본 값을 설정합니다.
  • default_factory : 기본 값이 필요할 때 호출될 callable을 지정할 수 있습니다. default와 중복해서 사용할 수 없고, 단 한가지만 명시해야합니다.
    • 쉽게 예를 들어, "default_factory=int"로 설정하면 int()인 0이, "default_factory=list"로 설정하면 list()인 [](empty list)가 설정됩니다.
  • init : True일 경우, __init__()의 parameter로 포함됩니다. 기본 값은 True 입니다.
  • repr : True일 경우, __repr__()의 반환 string에 포함됩니다. 기본 값은 True 입니다.
  • hash : bool 혹은 None일 수 있습니다. True일 경우, __hash__()에 포함됩니다. None일 경우 compare의 값을 사용합니다. 기본 값은 None 입니다.
  • compare : True일 경우, __eq__(), __gt__() 등의 동등성 및 비교 methods에 포함됩니다. 기본 값은 True 입니다.
  • metadata : mapping 또는 None일 수 있습니다. None일 경우 empty dict로 취급됩니다. Data Class에서는 사용되지 않고, 3rd-party extension mechanism으로 제공됩니다. 여러 3rd-pary가 각각 고유한 key를 가져 metadata에서 namespace로 사용할 수 있습니다.
  • kw_only : True일 경우, keyword-only로 설정됩니다.

또다른 사용 예를 하나 보여드릴게요.

from dataclasses import dataclass, field

@dataclass
class Vector:
    x: int = field(kw_only=True)
    y: int = field(kw_only=True)

vector = Vector(x=1, y=2)
print(vector)  # Vector(x=1, y=2)

Wrap Up

이번에는 Python에서 Data Class를 다루는 방법을 살펴보았습니다.

데이터만을 다룰 때 유용하게 사용할 수 있을 것입니다.

저도 써볼 기회가 없어서 아직 실전 활용을 해본 적은 없긴 합니다. ㅎㅎ

포스팅에서 설명드린 내용보다 더 많은 내용이 제공되긴 하지만, 실제 사용할 때 크게 유용하게 쓰이진 않을 것 같고 설명드린 정도만 알아도 사용에 큰 무리가 없다고 생각되어 간단하게 다뤄보았어요.

'Python' 카테고리의 다른 글

[Python] Abstract Base Classes  (0) 2023.02.23
[Python] Enumeration  (0) 2023.02.21
[Python] customtkinter 사용하기  (0) 2023.01.17
[PyQt6] GroupBox, CheckBox, RadioButton in QML  (0) 2022.11.21
[PyQt6] Dialogs in QML  (0) 2022.11.20

댓글