2013-05-12 2 views
7

우리는있는 dir() 내장 객체 슈퍼 클래스와 '더미', bodyless 클래스, 같은클래스는 기본 '__dict__'속성을 어디에서 가져 옵니까?

class A(): 
    pass 

로 우리는 클래스가 가지고있는 찾을 세 가지 특성 ('__dict__', '__module__' and '__weakref__')을 적용하여 생성 된 목록을 비교하는 경우 객체 클래스에 없습니다.

어디에서 A 클래스는 이러한 추가 속성을 상속합니까?

+0

"개체"의 부모로부터. –

답변

8
  • __dict__ 특성 type.__new__의 내부 코드에 의해 생성된다. 수업의 메타 클래스는 최종 콘텐츠 인 __dict__에 영향을 줄 수 있습니다. __slots__을 사용하는 경우 __dict__ 속성이 없습니다.

  • __module__은 클래스가 컴파일 될 때 설정되므로 인스턴스는 클래스에서이 특성을 상속받습니다. 테스트 inst.__module__ is cls.__module__ (inst이 의 인스턴스 인 경우)을 수행하고 cls.__module__을 수정하고 inst.__module__에이 변경 사항이 반영되어 있음을 확인하면이를 확인할 수 있습니다.

    (당신은 또한 cls.__module__에서 다른 값으로 inst.__module__ 설정처럼 바보 같은 일을 할 수이 읽기 전용 속성이 아닌 이유 확실하지..) 인스턴스가있는 경우

  • __weakref__이 생성; AFAIK는 내부 CPython 객체 생성 시스템에 의해 완전히 제어됩니다. 이 속성은 object 하위 클래스의 인스턴스에만 있습니다 (예 : int, list, set, tuple에는 __weakref__ 속성이 없음).

    이 설명을 해석 할 때 class C:은 Python3의 경우 class C(object):과 같습니다. Python2의 경우 class C:__weakref__ (또는 object 구현에서 얻은 다른 많은 속성 없음)없이 인스턴스를 생성합니다.

+1

'__dict__'는'type .__ new__'에 의해 설정됩니다. 메타 클래스의'__prepare__' 메쏘드에 의해 반환 된 값은 메타 클래스의'__new__' 메쏘드에 전달됩니다. (실제로는 새로운 클래스가 실제로 생성되면'type .__ new__'에 전달됩니다.) 'type .__ new__'는 실제 dict 이외의 것을 주면 불평합니다. 그래서'__prepare__'가 반환하는 것은 실제로'__dict__' 속성에 영향을 미치지 않습니다. 단지'__dict__'에 추가 될 * 내용 *을 누적하는 데 사용됩니다. Python2는 같지만 누적 컬렉션을 선택하지 않아도됩니다. – Ben

+0

@Ben : 감사합니다. – kampu

+2

"이 설명을 해석 할 때'클래스 C :'는'클래스 C (객체) :''와 동등합니다."- Py2가 아니라 Py3에서만 유효합니다. – glglgl

관련 문제