티스토리 뷰

python lecture/basic

[edu] __slots__ (__dict__)

burningrizen 2019. 1. 30. 10:21

클래스의 인스턴스는 기본적으로 attribute storage 를 위한 딕셔너리를 가지고 있다

(여기서 attribute 는 instance attribute인듯?, attribute:변수)


이로 인해 인스턴스 변수가 별로 없는 경우 객체의 공간을 낭비한다.



class Stack:
__slots__ = ("data",)

__slot__ 을 override 해서 인스턴스 변수를 리스트나 튜플로 미리 지정하면


메모리  낭비를 줄이고 속도를 향상 시킬수 있다.


실제로 __slots__ 을 지정하였을 때와 안했을 때 인스턴스의 사이즈가 다르다.




- __dict__ 가 없기 때문에 인스턴스는 __slots__ 에 명시되지 않은 새로운 변수를 할당할 수 없다.


- 만약 새로운 변수를 동적으로 할당해야 하는 상황이라면 __slots__ 에 지정된 변수 목록에

__dict__ 를 추가하는 방식으로 가능하다

(하지만 메모리 낭비의 이점이 없을 수도 있음(


- __slots__ 이 없는 class 를 상속 받을 경우 __dict__ 이 자동으로 상속되므로 

sub class 에서 __slots__ 은 무의미하다


- 반대로 __slots__ 가 있는 class 에서 상속 받더라도 sub class 에서 자동으로 __dict__ 가 생성되는

것을 막으려면 __slots__ 을 구현해 주어야 한다.



댓글