매직 메서드(magic method, dunder method)는 「언더스코어 두 개로 둘러싸인 특수 메서드」입니다.
__init__·__str__·__add__ 같은 형식이며, 파이썬의 기본 동작에 자기 클래스만의 의미를 부여할 수 있게 해 줍니다.
__str__과 __repr__는 가장 자주 정의하는 두 매직 메서드입니다.
둘 다 「인스턴스를 문자열로 표현」하지만 의도가 다릅니다.
__str__은 「사용자 친화적 표현」(print 시), __repr__은 「개발자 친화적 표현」(디버깅·인터프리터에서 그대로 쓰면 인스턴스 다시 만들 수 있을 정도).
예시.
class Point: def __init__(self, x, y): self.x, self.y = x, y; def __repr__(self): return f"Point({self.x}, {self.y})"; def __str__(self): return f"({self.x}, {self.y})".
p = Point(3, 4).
str(p) — "(3, 4)"(사용자용).
repr(p) — "Point(3, 4)"(개발자용).
__str__을 안 정의하면 __repr__이 대신 쓰입니다.
「반드시 __repr__은 정의하라」가 PEP 권장입니다.
디버깅 시 인스턴스가 출력될 때 의미 있는 표현이 보이는 게 매우 중요하기 때문입니다.
dataclass를 쓰면 __repr__이 자동 생성되는 것도 같은 이유입니다.
그 외에도 매직 메서드는 매우 풍부합니다.
__len__(len() 동작), __getitem__([] 동작), __iter__·__next__(반복), __eq__·__lt__(비교), __add__·__sub__(연산자), __call__(함수처럼 호출), __enter__·__exit__(with 문).
클래스에 매직 메서드를 정의하면 그 클래스를 파이썬 내장 문법과 자연스럽게 통합할 수 있습니다.
한 줄 요약
매직 메서드는 __name__ 형식의 특수 메서드로 클래스에 파이썬 기본 동작을 부여합니다.
__repr__은 디버깅용·반드시 정의 권장, __str__은 사용자용.
dataclass가 자동 생성합니다.
더 알아볼 것
- len·getitem으로 컬렉션처럼 만들기
- __call__ — 인스턴스를 함수처럼
- Python Data Model 공식 문서