Skip to content

Python:dataclasses

이 모듈은 init()repr() 과 같은 생성된 특수 메서드를 사용자 정의 클래스에 자동으로 추가하는 데코레이터와 함수를 제공합니다. 원래 PEP 557 에 설명되어 있습니다.

How to use

from dataclasses import dataclass

@dataclass
class InventoryItem:
    """Class for keeping track of an item in inventory."""
    name: str
    unit_price: float
    quantity_on_hand: int = 0

    def total_cost(self) -> float:
        return self.unit_price * self.quantity_on_hand

아래와 같은 init() 함수가 자동으로 추가된다.

def __init__(self, name: str, unit_price: float, quantity_on_hand: int = 0):
    self.name = name
    self.unit_price = unit_price
    self.quantity_on_hand = quantity_on_hand

dataclass

@dataclass
class Base:
    x: Any = 15.0
    y: int = 0

@dataclass
class C(Base):
    z: int = 10
    x: int = 15

Base를 상속받은 C는 다음의 생성자가 만들어진다.

def __init__(self, x: int = 15, y: int = 0, z: int = 10):

필드 커스텀

초기화 인자, __repr__ 포함 여부 등 특성 제어를 위해 field 함수를 사용하면 된다.

# -*- coding: utf-8 -*-

from typing import Optional, Any, List
from datetime import datetime
from dataclasses import dataclass, field


@dataclass
class Project:
    uid: Optional[int] = None
    group_uid: Optional[int] = None
    slug: Optional[str] = None
    name: Optional[str] = None
    description: Optional[str] = None
    features: Optional[List[str]] = None
    extra: Optional[Any] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None

    _group_slug: Optional[str] = field(default=None, init=False, repr=False)

    def remove_sensitive(self) -> None:
        self.uid = None
        self.group_uid = None

    @property
    def group_slug(self) -> Optional[str]:
        return self._group_slug

    @group_slug.setter
    def group_slug(self, value: Optional[str]):
        self._group_slug = value

default_factory

제공되면, 이 필드의 기본값이 필요할 때 호출되는 인자가 없는 콜러블이어야 합니다.

여러 용도 중에서도, 이것은 아래에서 논의되는 것처럼 가변 기본값을 가진 필드를 지정하는 데 사용될 수 있습니다.

default 와 default_factory 를 모두 지정하는 것은 에러입니다.

@dataclass
class C:
    mylist: list[int] = field(default_factory=list)

c = C()
c.mylist += [1, 2, 3]

See also

Favorite site