우선는와 A.__dict__.__dict__
다르며 A.__dict__['__dict__']
전자는 존재하지 않습니다. 후자는 __dict__
클래스의 인스턴스가 가질 수 있는 속성입니다. 특정 인스턴스에 대한 속성의 내부 사전을 반환하는 설명자 개체입니다. 간단히 말해 __dict__
객체 의 속성은 객체의에 저장할 수 없으므로 __dict__
클래스에 정의 된 설명자를 통해 액세스됩니다.
이것을 이해하려면 디스크립터 프로토콜 의 문서 를 읽어야합니다 .
짧은 버전 :
- 클래스 인스턴스의 경우에 대한
A
액세스 instance.__dict__
가 제공되며 A.__dict__['__dict__']
이는과 동일합니다 vars(A)['__dict__']
.
- 클래스 A의 경우에 대한 액세스
A.__dict__
는 type.__dict__['__dict__']
(이론상) vars(type)['__dict__']
.
긴 버전 :
클래스와 객체 모두 속성 연산자 (클래스 또는 메타 클래스를 통해 구현 __getattribute__
됨)와에서 사용하는 __dict__
속성 / 프로토콜을 통해 속성에 대한 액세스를 제공합니다 vars(ob)
.
일반 객체의 경우 __dict__
객체 dict
는 속성을 저장 하는 별도 의 객체를 만들고 __getattribute__
먼저 액세스를 시도하고 거기에서 속성을 가져옵니다 (설명자 프로토콜을 사용하여 클래스에서 속성을 찾으려고 시도하기 전과를 호출하기 전에 __getattr__
). __dict__
클래스 의 설명자는이 사전에 대한 액세스를 구현합니다.
x.name
위해 사람들을 시도하는 것과 같습니다 x.__dict__['name']
, type(x).name.__get__(x, type(x))
,type(x).name
x.__dict__
동일하지만 명백한 이유로 첫 번째 항목을 건너 뜁니다.
__dict__
of instance
를 __dict__
인스턴스에 저장할 수 없기 때문에 설명자 프로토콜을 통해 직접 액세스하고 인스턴스의 특수 필드에 저장합니다.
클래스의 경우에도 유사한 시나리오가 적용되지만 __dict__
, 사전 인 척하는 특수 프록시 개체 (내부적으로는 아닐 수 있음)이며이를 변경하거나 다른 것으로 대체 할 수 없습니다. 이 프록시를 사용하면 무엇보다도 자신에게 고유하고 기본 중 하나에 정의되지 않은 클래스의 속성에 액세스 할 수 있습니다.
기본적으로 vars(cls)
비어있는 클래스의 a 는에서 내부적으로 사용 __dict__
하는 인스턴스의 속성 과 클래스의 독 스트링 을 저장하기위한 세 개의 설명자를 전달 합니다. 정의하면 처음 두 개가 사라질 수 있습니다 . 그러면 및 속성이 없지만 대신 각 슬롯에 대해 단일 클래스 속성이 있습니다. 그러면 인스턴스의 속성이 사전에 저장되지 않고 클래스의 각 설명자가 액세스 할 수 있습니다.__weakref__
weakref
__slots__
__dict__
__weakref__
그리고 마지막으로, 불일치 A.__dict__
다른는 A.__dict__['__dict__']
속성이 있기 때문입니다 __dict__
입니다, 예외로, 결코 에서 보지 않았다 vars(A)
그래서 무엇 마찬가지입니다 것은 당신이 사용하는 거라고 거의 모든 다른 속성에 대한 사실이 아니다. 예를 들어 A.__weakref__
는 A.__dict__['__weakref__']
. 이 불일치가 존재하지 않으면 사용 A.__dict__
이 작동하지 않으며 항상 vars(A)
대신 사용해야 합니다.
ive
. 적어도 이것은 더 많은A.__dict__['ive']
질문을 만들었을 것입니다 ;) 나는 내 자신을 볼 것입니다