여정의 기록
[Python] @dataclass() 모듈을 사용하는 이유 본문
728x90
Kaggle 경진대회에 참가하고 있다. 다른 사람들은 어떻게 문제를 풀었는지 읽어보고있는데
@dataclasses 라는 모듈이 눈에 보였다. @가 붙은 많은 모듈이 눈에 보였다.
이것에 대해 간단하게 작성하려 한다.

우리는
변수에 원하는 데이터를 담아 사용할수 있듯이 클래스를 이용해 원하는 데이터를 저장하여 사용할 수 있다.
하지만 우리가 클래스에 원하는 데이터를 기록하고 저장하고 사용하는데는 여러코드가 필요한데 - 그 중에서도 해당 클래스를 불러서 확인할 때 데이터가 원하는 변수에 잘 들어갔는지 확인하는 것이라던가 같은 데이터라면 동등성equality를 가지게 해준다던가 - 원하는 기능들을 __repr__ , __eq__ 라는 함수를 넣어서 변수를 다시 하나하나 적어줘야한다. 데이터 클래스란 이러한 중복하며 계속 변수를 적는 과정을 줄여준다. (실수를 줄여주고 번거로움을 줄여준다!)
방법
dataclasses 모듈을 사용할 일반 클래스에 @dataclass 라고 선언만해주면 된다.
__inint__(), __repr__(), __eq__() 와 같은 메서드를 자동으로 생성해준다.
데이터를 자유자재로 변경할 수도 있다.
- 데이터의 불변성 immutability 보장하려면 frozen을 True로 선언한다. 이는 데이터를 변경할 수 없게 해준다.
@dataclass(frozen=True) - data class안에서 인스턴스 간 대소비교를 하기 위해선 order=True라는 옵션을 주어야한다. 정렬이 가능해진다.
@dataclass(order=True) - hashable 하지 않기 때문에 set의 값이나 dict의 키로 사용할 수 없다. 하지만 원한다면 unsafe_has=True 옵션을 사용할 수 있다. set을 이용해서 중복 제거도 가능하겠다.
@dataclass(unsafe_has=True) - 클래스에서 정의한 filed의 default 값은 instence 간에 공유한다. 그래서 그냥 []로 기본값 할당하는 것은 불가능하다. 하지만 이 또한 원한다면 매번 새로운 리스트가 생성될 수 있도록 허가해주는 방식을 사용하게 되는데, filed(default_factory=list) 이런 옵션을 사용한다.
1, 2, 3 의 예시)
@dataclass(frozen=True, order=True, unsafe_has=True)
4의 예시)
@dataclass
class C:
mylist: list[int] = field(default_factory=list)
c = C()
c.mylist += [1, 2, 3]
이외의 다른 기능들은 https://docs.python.org/3/library/dataclasses.html 여기에서 확인할 수 있다.
https://www.daleseo.com/python-dataclasses/ 를 읽고 공부하고 간단하게 요약했습니다. 글 감사합니다.
728x90
'공부 > Python' 카테고리의 다른 글
맥에서 MySql 설치하기 (0) | 2022.08.23 |
---|---|
코랩이용하여 구글 드라이브 파일 삭제하기 (0) | 2022.07.08 |
Python/datetime 함수 (0) | 2022.02.12 |
Python/Class (0) | 2022.02.12 |
Python/파이썬의 함수들(절대값 abs, any all, ord, eval,filter, pow, round, zip, reduce, run-length기법) (0) | 2022.02.11 |