본문 바로가기

프로그래밍 언어/python

Data Classes

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/

 

[파이썬] 데이터 클래스 사용법 (dataclasses 모듈)

Engineering Blog by Dale Seo

www.daleseo.com

- https://realpython.com/python-data-classes/

 

Data Classes in Python 3.7+ (Guide) – Real Python

Data classes are one of the new features of Python 3.7. With data classes you do not have to write boilerplate code to get proper initialization, representation and comparisons for your objects.

realpython.com

 

반응형

'프로그래밍 언어 > 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