1. 설명
- 파이썬 3.7 부터 도입된 문법이고, 간략화된 데이터 정의를 가능하게 한다.
<기존 방법>
class RegularCard:
def __init__(self, rank, suit):
self.rank = rank
self.suit = suit
def __repr__(self):
return (f'{self.__class__.__name__}' \
f'(rank={self.rank!r}, suit={self.suit!r})'
def __eq__(self, other):
if other.__class__ is not self.__class__:
return NotImplemented
return (self.rank, self.suit) == (other.rank, other.suit)
>>> queen_of_hearts = RegularCard('Q', 'Hearts')
>>> queen_of_hearts
<__main__.RegularCard object at 0x7fb6eee35d30>
>>> queen_of_hearts == RegularCard('Q', 'Hearts')
False
<데이터 클래스 사용>
- 데이터 클래스는 __init__(), __repr__(), __eq__()와 같은 메서드를 자동으로 생성해준다.
from dataclasses import dataclass
@dataclass
class DataClassCard:
rank: str
suit: str
>>> queen_of_hearts = DataClassCard('Q', 'Hearts')
>>> queen_of_hearts
DataClassCard(rank='Q', suit='Hearts')
>>> queen_of_hearts == DataClassCard('Q', 'Hearts')
True
2. 불변 데이터 만들기
- frozen=True 옵션을 주면 데이터 수정이 불가능하게 만들 수 있다.
from dataclasses import dataclass
@dataclass(frozen=True)
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
>>> pos = Position('Oslo', 10.8, 59.9)
>>> pos.name
'Oslo'
>>> pos.name = 'Stockholm'
dataclasses.FrozenInstanceError: cannot assign to field 'name'
3. 상속
- Position 클래스를 상속 받은 Capital 클래스의 초기 인자는 부모 인자의 다음(세번째)에 추가 된다.
from dataclasses import dataclass
@dataclass
class Position:
name: str
lon: float
lat: float
@dataclass
class Capital(Position):
country: str
>>> Capital('Oslo', 10.8, 59.9, 'Norway')
Capital(name='Oslo', lon=10.8, lat=59.9, country='Norway')
- 만약 부모 클래스가 초기 값을 가지고 있다면, 상속 받은 자식 클래스도 초기 값을 가지고 있어야 한다.
- 또한, 자식 클래스에서 재정의 되더라도, 순서는 바꾸지 않는다.
from dataclasses import dataclass
@dataclass
class Position:
name: str
lon: float = 0.0
lat: float = 0.0
@dataclass
class Capital(Position):
#country: str # Does NOT work
country: str = 'Unknown'
lat: float = 40.0
>>> Capital('Madrid', country='Spain')
Capital(name='Madrid', lon=0.0, lat=40.0, country='Spain') # 재정의 하더라도, lat의 순서는 그대로다
참고
- https://www.daleseo.com/python-dataclasses/
- https://realpython.com/python-data-classes/
반응형
'프로그래밍 언어 > python' 카테고리의 다른 글
Python에서 Call By Reference 구현하는 법 (0) | 2023.03.13 |
---|---|
파이썬 프로퍼티(Property) (0) | 2023.01.08 |
[OS] python 과 실행파일 (0) | 2021.04.09 |
경로 유틸리티 (0) | 2021.02.07 |
Collections utils (0) | 2020.11.29 |