'@dataclass' 데코레이터와 '->' 연산자에 대해 중점적으로 설명하겠습니다.
상세 설명
- '@dataclass' 데코레이터:
'@dataclass'는 Python 3.7부터 도입된 기능으로, 데이터 클래스를 쉽게 만들 수 있게 해줍니다. 이 데코레이터를 사용하면 클래스의 'init', 'repr', 'eq' 등의 메서드를 자동으로 생성해줍니다. 주로 데이터를 저장하고 관리하는 용도로 사용됩니다. - '->' 연산자:
이는 함수 주석(function annotation)을 위한 구문입니다. 함수의 반환 타입을 명시하는 데 사용됩니다. 'load_config' 함수에서 '-> Config'는 이 함수가 'Config' 타입의 객체를 반환한다는 것을 나타냅니다.
예제 코드
코드의 각 부분을 자세히 살펴보겠습니다:
@dataclass
class Config:
workbook_name: str
sheet_name_list: List[str]
base_row_pos: int
base_col_pos: List[int]
output_excel_filename: str
output_word_filename: str
이 부분은 'Config'라는 데이터 클래스를 정의합니다. 각 필드의 타입이 명시되어 있습니다.
def load_config(json_file: str) -> Config:
이 줄은 'load_config' 함수를 정의합니다. 이 함수는 문자열 타입의 'json_file'을 매개변수로 받고, 'Config' 객체를 반환합니다.
이 코드는 설정 정보를 관리하고 JSON 파일에서 설정을 로드하는 기능을 구현하는 데 사용될 수 있습니다.
dataclass 상세
dataclass는 주로 데이터를 보관하는 클래스를 쉽게 만들기 위해 Python 3.7에서 도입되었습니다. 이 기능의 주요 특징과 장점은 다음과 같습니다:
- 간결한 클래스 정의:
데이터 필드만 정의하면 되므로, 클래스 작성이 매우 간단해집니다. - 자동 메서드 생성:
__init__()
,__repr__()
,__eq__()
등의 특수 메서드를 자동으로 생성해줍니다. - 타입 힌팅:
각 필드의 타입을 명시할 수 있어, 코드의 가독성과 안정성이 향상됩니다. - 불변성 지원:
frozen=True
파라미터를 사용하여 불변 객체를 만들 수 있습니다. - 기본값 설정:
필드에 기본값을 쉽게 설정할 수 있습니다. - 비교 연산 지원:
객체 간 비교를 위한 메서드들이 자동으로 생성됩니다.
간단한 예시를 통해 dataclass의 사용법을 보여드리겠습니다:
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
city: str = "Seoul" # 기본값 설정
# 객체 생성
person1 = Person("Kim", 30)
person2 = Person("Lee", 25, "Busan")
print(person1) # Person(name='Kim', age=30, city='Seoul')
print(person2) # Person(name='Lee', age=25, city='Busan')
# 자동 생성된 __eq__() 메서드 사용
print(person1 == Person("Kim", 30)) # True
이처럼 dataclass를 사용하면 간단하고 명확한 방식으로 데이터 중심의 클래스를 정의할 수 있습니다. 특히 설정, DTO(Data Transfer Object), 모델 클래스 등을 작성할 때 매우 유용합니다.
__repr__()
메서드
__repr__()
메서드는 객체의 문자열 표현을 반환합니다. dataclass에서는 이 메서드가 자동으로 생성됩니다.
from dataclasses import dataclass
@dataclass
class Book:
title: str
author: str
year: int
# 객체 생성
book = Book("1984", "George Orwell", 1949)
# __repr__() 메서드 사용
print(repr(book)) # Book(title='1984', author='George Orwell', year=1949)
print(book) # Book(title='1984', author='George Orwell', year=1949)
# 리스트에서의 __repr__() 사용
book_list = [
Book("To Kill a Mockingbird", "Harper Lee", 1960),
Book("Pride and Prejudice", "Jane Austen", 1813)
]
print(book_list)
# [Book(title='To Kill a Mockingbird', author='Harper Lee', year=1960),
# Book(title='Pride and Prejudice', author='Jane Austen', year=1813)]
iteration에 대한 예제
dataclass 자체는 직접적으로 iteration을 지원하지 않지만, 리스트와 같은 iterable 속성을 가질 수 있습니다. 또한 __iter__()
메서드를 정의하여 iteration을 지원할 수 있습니다.
from dataclasses import dataclass
from typing import List
@dataclass
class Library:
name: str
books: List[Book]
def __iter__(self):
return iter(self.books)
# 객체 생성
library = Library("City Library", [
Book("1984", "George Orwell", 1949),
Book("To Kill a Mockingbird", "Harper Lee", 1960),
Book("Pride and Prejudice", "Jane Austen", 1813)
])
# iteration 사용
for book in library:
print(f"{book.title} by {book.author}")
# 출력:
# 1984 by George Orwell
# To Kill a Mockingbird by Harper Lee
# Pride and Prejudice by Jane Austen
# list comprehension 사용
titles = [book.title for book in library]
print(titles) # ['1984', 'To Kill a Mockingbird', 'Pride and Prejudice']
이 예제에서 Library
클래스는 __iter__()
메서드를 정의하여 iteration을 지원합니다. 이를 통해 Library
객체를 직접 순회할 수 있으며, 각 Book
객체에 접근할 수 있습니다. 이러한 방식으로 dataclass를 사용하면 데이터 중심의 클래스를 쉽게 만들고, 그 객체들을 효과적으로 표현하고 다룰 수 있습니다.
'IT > 파이썬' 카테고리의 다른 글
문자열 표현시 r'' 의 비밀 (0) | 2024.10.04 |
---|---|
파일 경로 정리하기 - \, /, ./, .. 문자열 처리 등 (0) | 2024.10.04 |
argparse - add_argument 인자 설명 (0) | 2024.06.21 |
폴더내 파일리스트를 만드는 스크립트 - 개발 유틸 (0) | 2024.06.20 |
예제 폴더에 들어가는 더미 파일 만들기 스크립트 - 파일명만 있으면 (0) | 2024.06.20 |