__slots__는 「클래스가 가질 수 있는 인스턴스 속성을 미리 고정해 메모리를 절약하는」 기능입니다.
수백만 개의 인스턴스를 만들어야 할 때 결정적인 효과를 봅니다.
기본 사용.
class Point: __slots__ = ("x", "y"); def __init__(self, x, y): self.x = x; self.y = y.
p = Point(3, 4) — 정상.
p.z = 5 — AttributeError(__slots__에 없는 속성 추가 불가).
메모리 효과.
일반 파이썬 인스턴스는 속성을 dict로 관리하는데, dict는 한 인스턴스당 280바이트 정도를 씁니다.
__slots__를 쓰면 dict 대신 고정 슬롯을 써 50~80바이트 정도로 줄어듭니다.
100만 개 인스턴스라면 약 200MB 절약.
추가 효과.
속성 접근도 약간 빨라지고(20~30%), 의도하지 않은 속성 추가를 막아 「오타로 새 속성」 함정도 막아 줍니다.
「name」을 「nme」로 잘못 쓰면 일반 클래스는 자동으로 새 속성이 생기지만, __slots__는 즉시 오류를 냅니다.
단점·주의.
1) 동적 속성 추가가 안 됨(설계 의도 — 좋을 수도 나쁠 수도).
2) 다중 상속에서 복잡해짐.
3) __dict__가 없으니 일부 라이브러리(예: 일부 직렬화)와 호환 문제 가능.
「일반 클래스로 시작하고, 정말 메모리가 문제될 때만 __slots__로 옮기는 것」이 권장 흐름입니다.
한 줄 요약
__slots__는 인스턴스 속성을 미리 고정해 메모리를 50~80%까지 줄이는 기능입니다.
100만 개 단위 인스턴스에 결정적이며, 의도하지 않은 속성 추가도 막아 줍니다.
더 알아볼 것
- __slots__와 dataclass의 결합
- __slots__의 상속 시 복잡성
- attrs·msgspec 같은 대안 라이브러리