2017-12-29 5 views
4

속성 __dict__은 사용자 정의 속성을 포함해야합니다. 우리는 빈 클래스의 __dict__를 인쇄 할 경우에, 나 또한 얻을 것 다음 __dict__ 파이썬에 의해 미리 입력되어Python __dict__

__module__ 
__dict__ 
__weakref__ 
__doc__ 

는 클래스 객체 유형에 따라 때문이다.

이제 __base____class__은 클래스 객체 유형의 파이썬 정의 속성이지만 __dict__에는 포함되지 않습니다.

어떤 dunder 속성이 객체 __dict__에 포함되어 있고 어떤 dunder 속성이 포함되어 있지 않은지 지정하는 규칙이 있습니까?

답변

9

속성 __dict__에는 사용자 정의 속성이 포함되어 있다고 가정합니다.

없음은 __dict__동적 속성을 객체의이 포함되어 있습니다. 객체가 가질 수있는 유일한 속성은 아니지만 객체의 유형도 일반적으로 속성을 찾기 위해 참조됩니다.

예를 들어, 클래스의 메소드는 인스턴스의 속성으로도 찾을 수 있습니다. 조회 할 때 많은 그러한 속성은 descriptor objects이고 바인딩 된입니다. 모든 클래스가 object에서 상속받는 __getattribute__ 메서드의 작업입니다. 객체의 속성은 type(object).__getattribute__(attribute_name)을 통해 확인됩니다.이 시점에서 유형에 대한 설명자와 객체에 직접 설정된 속성 (__dict__ 매핑에서)이 고려됩니다.

클래스의 __bases__ 속성은 클래스 메타 유형 (기본값 : type())에 의해 제공됩니다.

>>> class Foo: 
...  pass 
... 
>>> Foo.__bases__ 
(<class 'object'>,) 
>>> type.__dict__['__bases__'] 
<attribute '__bases__' of 'type' objects> 
>>> type.__dict__['__bases__'].__get__(Foo, type) 
(<class 'object'>,) 

__dict__ 단지 유효한 문자열 이름을 가질 수있는 속성을 저장하는 장소가 될 일이 : 그것은 설명이다. 클래스가 생성 될 때 설정되는 몇 가지 표준 속성 (__module____doc__)을 포함하는 클래스 및 클래스 인스턴스 (__dict____weakref__)에 대한 설명자로 존재하는 기타 후자는 클래스에 추가해야합니다. 클래스 자체에도 type에서 가져온 속성이 설명자로 사용되기 때문입니다.

그렇다면 __bases__은 (는) 왜 설명자입니까, 그러나 __doc__은 아닌가요? 설명자 설정 기가 특정 조건을 검사하고 내부 캐시를 다시 작성할 수있는 기회이므로 __bases__을 아무 것도 설정할 수 없습니다. Python 핵심 개발자는 설명자를 사용하여 설정할 수있는 항목을 제한하거나 값을 설정하면 추가 작업 (예 : 유효성 검사 및 내부 구조 업데이트)이 필요합니다.

+0

답장을 보내 주셔서 감사합니다. @Martijn. 그것은 매우 도움이되었습니다. –

+0

['__bases__'는 쓰기 가능합니다] (https://ideone.com/Qv2EHe) (적어도'__doc__'가 쓰기 가능한 동일한 클래스들에 대해서). 이것은 설정을하기 때문에'type .__ setattr__'에 잘 맞지 않는 추가 처리가 필요하고 구현이 클래스의 메모리 레이아웃에있는 전용 슬롯에 기본 데이터를 저장하는 것이 더 편리하고 (더 효율적이기 때문에) 연관된 사전에 넣는 대신 – user2357112

+0

@ user2357112 : 예, 물론, 문구가 업데이트되었습니다. –

관련 문제