> 백엔드 개발 > 파이썬 튜토리얼 > Python에서 바닐라 객체에 속성을 할당할 수 없는 이유는 무엇입니까?

Python에서 바닐라 객체에 속성을 할당할 수 없는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-14 14:39:01
원래의
1028명이 탐색했습니다.

Why can't you assign attributes to vanilla objects in Python?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿