Python의 dataclass
는 데이터 중심의 클래스를 간단하게 정의할 수 있도록 도와주는 기능입니다.
일반적으로 데이터를 저장하는 용도로 클래스를 사용할 때, __init__
, __repr__
, __eq__
등의 메서드를
일일이 구현해야 하지만, dataclass
를 사용하면 이러한 작업을 자동화할 수 있습니다.
Python 3.7에서 도입되었으며, dataclasses
모듈에서 제공됩니다.
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
p1 = Person(name="Alice", age=30)
print(p1) # Person(name='Alice', age=30)
위 코드에서 dataclass
데코레이터를 사용하여 Person
클래스를 정의하면,
자동으로 __init__
, __repr__
, __eq__
등의 메서드가 생성됩니다.
필드에 기본값을 지정할 수도 있습니다.
@dataclass
class Person:
name: str
age: int = 25 # 기본값 설정
p1 = Person(name="Bob")
print(p1) # Person(name='Bob', age=25)
dataclass
에서는 field()
를 사용하여 필드의 동작을 보다 정교하게 제어할 수 있습니다.
from dataclasses import dataclass, field
@dataclass
class Person:
name: str
age: int = field(default=25, metadata={"info": "나이 정보"})
friends: list = field(default_factory=list) # 기본값으로 빈 리스트 지정
p1 = Person(name="Charlie")
p1.friends.append("David")
print(p1) # Person(name='Charlie', age=25, friends=['David'])
dataclass
는 기본적으로 객체를 비교할 수 있도록 __eq__
메서드를 자동으로 생성합니다.
하지만 특정 설정을 변경할 수도 있습니다.
@dataclass(order=True)
class User:
id: int
username: str
u1 = User(1, "Alice")
u2 = User(2, "Bob")
print(u1 < u2) # True (id를 기준으로 비교)
__init__
, __repr__
, __eq__
등의 메서드를 자동 생성하여 코드량이 줄어듭니다.field()
를 이용하여 다양한 속성을 설정할 수 있습니다.order=True
를 설정하면 객체 비교가 가능합니다.dataclass
를 사용하면 객체를 JSON으로 쉽게 변환할 수 있습니다.
import json
from dataclasses import dataclass, asdict
@dataclass
class Product:
id: int
name: str
price: float
p1 = Product(1, "Laptop", 999.99)
p1_json = json.dumps(asdict(p1)) # JSON 변환
print(p1_json) # {"id": 1, "name": "Laptop", "price": 999.99}
dataclass
를 사용하여 입력 데이터를 검증하는 것도 가능합니다.
@dataclass
class Temperature:
celsius: float
@property
def fahrenheit(self) -> float:
return self.celsius * 9 / 5 + 32
t = Temperature(25)
print(t.fahrenheit) # 77.0
Dataclass는 상속을 통해 확장할 수 있습니다.
@dataclass
class Employee:
name: str
department: str
@dataclass
class Manager(Employee):
team_size: int
m1 = Manager(name="Eve", department="IT", team_size=10)
print(m1) # Manager(name='Eve', department='IT', team_size=10)
frozen=True
옵션을 사용하면 객체가 불변(immutable)하게 설정됩니다.
@dataclass(frozen=True)
class Config:
setting: str
c = Config(setting="dark mode")
# c.setting = "light mode" # AttributeError 발생
객체마다 자동으로 고유한 ID를 부여할 수도 있습니다.
import uuid
from dataclasses import dataclass, field
@dataclass
class Task:
id: str = field(default_factory=lambda: str(uuid.uuid4()))
description: str
new_task = Task(description="Complete project")
print(new_task) # Task(id='...', description='Complete project')