Python에서 객체에 대한 속성 설정: 제한 사항 이해
Python에서는 다음에서 상속된 클래스의 인스턴스에 속성을 설정할 수 있습니다. 객체 클래스이지만 객체 클래스 자체의 인스턴스에는 직접적으로 존재하지 않습니다. 이러한 구별은 질문을 제기합니다. 왜 바닐라 객체에 속성을 할당하는 것이 금지됩니까?
객체 인스턴스에 사전이 없음
임의의 속성 할당을 지원하려면, 객체에는 속성을 저장할 수 있는 사전 역할을 하는 dict 속성이 필요합니다. 그러나 객체 클래스의 인스턴스는 그러한 dict__를 소유하지 않습니다. Python에서 모든 객체에 대해 __dict를 생성하면 상당한 메모리 오버헤드가 부과됩니다. 속성을 활용하지 않는 객체라도 모든 객체에 존재해야 하기 때문입니다.
이는 pimpler를 사용하여 시연할 수 있습니다. 프로젝트. 크기 측정에 따르면 사전(속성을 보유할 수 있는 객체)은 144바이트를 소비하는 반면 정수(속성이 없는 객체)는 16바이트만 필요합니다. __dict__를 도입하면 간단한 객체라도 메모리 사용량이 상당히 늘어납니다.
상속 및 속성 할당
객체 클래스에서 상속되는 클래스를 생성할 때 상황이 변합니다. dict 속성이 새 클래스의 각 인스턴스에 추가되어 임의의 속성을 가질 수 있습니다. 그러나 이러한 유연성에는 저장 비용이 발생합니다.
예를 들어 int에서 상속되는 dint라는 클래스를 생성하면 인스턴스가 184바이트를 차지하게 되는데, 이는 일반 정수의 16바이트보다 훨씬 높습니다. 이 차이는 추가 dict 속성으로 인해 발생합니다.
slots Alternative
인스턴스가 소수의 특정 속성을 사용하는 경우 Python은 slots 특수 속성을 제공합니다. 슬롯을 속성 이름이 포함된 일련의 문자열로 정의함으로써 클래스는 인스턴스가 소유할 수 있는 속성 집합을 제한할 수 있습니다. 이 메커니즘은 __dict__ 생성을 방지하여 메모리를 절약합니다.
예를 들어 int에서 상속되고 "foobar"라는 단일 속성 슬롯을 정의하는 fint라는 클래스를 생성하면 인스턴스의 메모리 공간이 80바이트로 줄어듭니다. 이는 여전히 정수보다 크지만 __dict__가 있는 클래스보다 훨씬 작습니다.
결론
요약하자면 Python의 바닐라 객체에는 dict 속성이 없기 때문에 속성을 할당할 수 없습니다. 이는 속성이 필요한지 여부에 관계없이 모든 객체에 dict가 필요하기 때문에 주로 메모리를 절약하기 위해 수행됩니다. 그러나 상속된 클래스는 dict를 포함하여 속성을 가질 수 있으며 slots 메커니즘은 제한된 수의 특정 속성이 필요할 때 효율적인 대안을 제공합니다.
위 내용은 Python에서 바닐라 객체에 속성을 할당할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!