본문 바로가기
Python

Python __slots__

by programmer-ds 2023. 1. 15.

Python은 객체의 속성(변수)을 관리하기 위해 Dictionary를 사용합니다.

Dictionary는 메모리를 많이 차지하는데, 많은 객체를 생성하게 되면 그만큼 많은 Dictionary를 사용하게 되므로 많은 메모리를 사용하게 되어 시스템에 부담을 줄 수 있다.

 

아래 코드의 결과처럼  user.__dict__를 통해 Python은 객체의 속성을 관리하기 위해 Dictionary를 사용하는 것을 확인할 수 있다.

 

class User:
    def __init__(self, id, name, pwd):
        self.id = id
        self.name = name
        self.pwd = pwd
    
    def __str__(self):
        return f'{self.name}의 ID는 {self.id}입니다.'

user = User('test', '길동', '1234')
print(user.__dict__)

>> {'id': 'test', 'name': '길동', 'pwd': '1234'}

 

 

또한, 객체의 속성을 생성 및 접근하게 되면 Dictionary를 거치는 과정으로 인해 성능적으로도 좋지 않을 수 있다.

그래서 Python에서는  '__slots__' 이라는 것을 제공한다.

 '__slots__' 로 객체 속성을 제한하면 객체는 속성을 관리하기 위해 Dictionary를 사용하지 않고 Direct 하게 변수를 관리하게 할 수 있는데, 메모리를 절약하고, 접근 속도도 개선할 수 있다.

 

__slots__

__slots__ 를 사용하는 방법은 클래스에서 __slots__ 키워드를 사용하고, 튜플 혹은 리스트로 사용할 변수명을 입력해 준다. 

아래 코드의 결과에서 확인할 수 있듯이 user 객체는 __dict__를 사용하지 않기 때문에 user.__dict__를 출력하였을 때 에러가 발생하는 것을 확인할 수 있다.

 

 

class User:
    __slots__ = ('id', 'name', 'pwd')

    def __init__(self, id, name, pwd):
        self.id = id
        self.name = name
        self.pwd = pwd
    
    def __str__(self):
        return f'{self.name}의 ID는 {self.id}입니다.'

user = User('test', '길동', '1234')

print(user.id, user.name, user.pwd)
print(user.__dict__)

>> test 길동 1234
>> Traceback (most recent call last):
  File "C:\Users\VisualStudioCodeProject\Python\test.py", line 28, in <module>
    print(user.__dict__)
 AttributeError: 'User' object has no attribute '__dict__'

 

 

위와 같이 코드를 작성하게되면  __slots__에 입력한 변수 외에는 다른 변수를 생성하거나 사용할 수 없다.

user = User('test', '길동', '1234')
user.age = 20

>> Traceback (most recent call last):
  File "C:\Users\VisualStudioCodeProject\Python\test.py", line 27, in <module>
    user.age = 20
AttributeError: 'User' object has no attribute 'age'

 

동적으로 속성을 할당하는 것이 불가능해지므로 단점으로 볼 수 있지만,

객체의 속성에 접근 속도가 향상되고 메모리가 절약되는 장점이 있을 수 있다.

'Python' 카테고리의 다른 글

Python 타입 어노테이션 Part2  (0) 2023.01.01
Python 타입 어노테이션 Part1  (0) 2022.12.31