이 모듈은 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 |
댓글