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 |