PHpullh
학습 라이브러리/Python/dataclass & 매직 메서드

PYTHON · 객체지향

dataclass & 매직 메서드

@dataclass로 보일러플레이트를 제거하고, 매직 메서드로 연산자를 오버로드합니다.

객체지향중급dataclass__post_init__field매직메서드__add__

핵심 설명

@dataclass로 보일러플레이트를 제거하고, 매직 메서드로 연산자를 오버로드합니다.

Python code

from dataclasses import dataclass, field
from typing import List

@dataclass
class Point:
    x: float
    y: float

    def distance(self) -> float:
        return (self.x**2 + self.y**2) ** 0.5

    # 연산자 오버로딩
    def __add__(self, other: "Point") -> "Point":
        return Point(self.x + other.x, self.y + other.y)

    def __abs__(self) -> float:
        return self.distance()

@dataclass(frozen=True)   # immutable (hash 가능)
class Color:
    r: int; g: int; b: int

    def __post_init__(self):
        for val in (self.r, self.g, self.b):
            if not 0 <= val <= 255:
                raise ValueError(f"RGB 값은 0-255: {val}")

@dataclass
class Team:
    name: str
    members: List[str] = field(default_factory=list)

    def __len__(self):  return len(self.members)
    def __contains__(self, item): return item in self.members
    def __iter__(self): return iter(self.members)

p1 = Point(3, 4)
p2 = Point(1, 2)
print(p1 + p2)       # Point(x=4, y=6)
print(abs(p1))       # 5.0

team = Team("Dev", ["Alice", "Bob"])
print(len(team))            # 2
print("Alice" in team)      # True
for member in team:
    print(member)

학습 팁

@dataclass(frozen=True)는 불변 객체를 만들고 __hash__를 자동 생성합니다. 딕셔너리 키나 세트 원소로 사용할 수 있습니다.

주의할 점

@dataclass에서 가변 기본값(list, dict)은 직접 쓸 수 없습니다. field(default_factory=list)를 사용하세요.

자주 묻는 질문

dataclass & 매직 메서드란 무엇인가요?

@dataclass 로 보일러플레이트를 제거하고, 매직 메서드로 연산자를 오버로드합니다.

dataclass & 매직 메서드 학습 시 주의할 점은 무엇인가요?

@dataclass 에서 가변 기본값(list, dict)은 직접 쓸 수 없습니다. field(default_factory=list) 를 사용하세요.