파이썬에서 __slots__
는 클래스 속성을 고정하여 메모리 사용을 최적화하고 성능을 향상시키는 데 사용된다. 기본적으로 파이썬 객체는 __dict__
라는 딕셔너리를 사용하여 속성을 저장한다. 하지만 __slots__
를 사용하면 이 딕셔너리를 생략하고, 고정된 속성만을 가진 객체를 만들 수 있다.
기본 사용법
다음은 __slots__
의 기본적인 사용법이다.
class MyClass:
__slots__ = ['attribute1', 'attribute2']
def __init__(self, attribute1, attribute2):
self.attribute1 = attribute1
self.attribute2 = attribute2
# 사용 예시
obj = MyClass(10, 20)
print(obj.attribute1) # 10
print(obj.attribute2) # 20
# 새로운 속성을 추가하려고 하면 오류 발생
try:
obj.attribute3 = 30
except AttributeError as e:
print(e) # 'MyClass' object has no attribute 'attribute3'
자세한 설명
__slots__의 장점
메모리 사용 감소:
__slots__
를 사용하면 객체가__dict__
를 사용하지 않기 때문에 메모리 사용량이 줄어든다.성능 향상: 메모리 사용이 최적화되어 객체 생성 및 속성 접근 속도가 빨라진다.
__slots__의 제한사항
고정된 속성:
__slots__
에 명시된 속성 외에 새로운 속성을 추가할 수 없다.상속의 제한:
__slots__
를 사용한 클래스를 상속할 때 자식 클래스도__slots__
를 명시적으로 정의해야 한다.호환성 문제: 일부 라이브러리나 기능과의 호환성에 문제가 있을 수 있다.
상속에서의 __slots__
__slots__
를 사용한 클래스를 상속할 때 자식 클래스에서 __slots__
를 추가로 정의할 수 있다. 이 경우, 부모 클래스의 __slots__
를 자식 클래스에 포함시켜야 한다.
class Parent:
__slots__ = ['attribute1']
def __init__(self, attribute1):
self.attribute1 = attribute1
class Child(Parent):
__slots__ = ['attribute2']
def __init__(self, attribute1, attribute2):
super().__init__(attribute1)
self.attribute2 = attribute2
# 사용 예시
child = Child(10, 20)
print(child.attribute1) # 10
print(child.attribute2) # 20
# 새로운 속성을 추가하려고 하면 오류 발생
try:
child.attribute3 = 30
except AttributeError as e:
print(e) # 'Child' object has no attribute 'attribute3'
__slots__의 응용 예제
다음은 __slots__
를 사용하여 메모리 사용을 최적화한 간단한 2D 점(Point) 클래스를 구현한 예제이다.
class Point:
__slots__ = ['x', 'y']
def __init__(self, x, y):
self.x = x
self.y = y
# 사용 예시
p1 = Point(1, 2)
p2 = Point(3, 4)
print(p1.x, p1.y) # 1 2
print(p2.x, p2.y) # 3 4
# 메모리 사용량 비교
import sys
class PointWithoutSlots:
def __init__(self, x, y):
self.x = x
self.y = y
p3 = PointWithoutSlots(1, 2)
print("With __slots__: ", sys.getsizeof(p1)) # __slots__ 사용 시
print("Without __slots__: ", sys.getsizeof(p3)) # __slots__ 미사용 시
이 예제에서는 __slots__
를 사용하여 Point
클래스의 메모리 사용량을 최적화하였다. sys.getsizeof()
함수를 사용하여 __slots__
를 사용한 경우와 사용하지 않은 경우의 메모리 사용량을 비교할 수 있다.