Python 소스 학습 의 PyTypeType 과 PyBaseObject유형 상세 설명

PyType_Type 과 PyBaseObjectType
PyObject 와 PyTypeObject내용 의 마지막 부분 에서 다음 그림 에서 사례 대상 과 유형 대상 에 대한 이해 가 정확 하지 않다 고 지적 했다.
Alt
부동 소수점 형식 대상 은 전역 에서 유일 합 니 다.Python 은 C 언어 차원 에서 이 를 실현 하 는 과정 에서 전체 정적 변수 로 정의 하고Object/floatobject.c에서PyFloat_Type로 정의 합 니 다.

PyTypeObject PyFloat_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "float",
    sizeof(PyFloatObject),
    0,
    (destructor)float_dealloc,                  /* tp_dealloc */

    // ...
    (reprfunc)float_repr,                       /* tp_repr */

    // ...
};
  • 두 번 째 줄 은 초기 화ob_refcnt,ob_typeob_size세 필드 를 사용 하고PyVarObject_HEAD_INIT의 정 의 는박문1.4.3 절의 내용 을 참고 할 수 있다.
  • 세 번 째 줄 은tp_name필드 를 유형 이름'float'
  • 로 초기 화 합 니 다.
  • 그리고 아래 는 각종 조작 함수 지침
  • ob_type포인터 가 가리 키 는PyType_Type이것 도 정적 으로 정 의 된 전역 변수 입 니 다.'유형의 유형'을 나타 내 는 type 대상 은PyType_Type이다.
    유형Tpye(type 의 실체)
    상기 에서 float 유형 대상 은 바 텀 실현 과정 에서 대응PyFloat_Type전체 정적 변수 이다.Python 유형 은 하나의 대상 이 고 자신의 유형 도 있 습 니 다.즉,Python 의 type 입 니 다.
    
    >>> float.__class__
    <class 'type'>
    사용자 정의 형식 도 같은 규칙 을 따 르 고,
    
    >>> class Foo(object):
    ...     pass
    ...
    >>> Foo.__class__
    <class 'type'>
    PyFloat_Type코드 가 실 현 된 것 을 볼 때ob_type필드 가 가리 키 는PyType_Type은 type 의 실현 이다.Object/typeobject.c에서 정의 합 니 다.
    
    PyTypeObject PyType_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
        "type",                                     /* tp_name */
        sizeof(PyHeapTypeObject),                   /* tp_basicsize */
        sizeof(PyMemberDef),                        /* tp_itemsize */
        (destructor)type_dealloc,                   /* tp_dealloc */
    
        // ...
        (reprfunc)type_repr,                        /* tp_repr */
    
        // ...
    };
    
  • 내장 유형 과 사용자 정의 클래스PyTypeObject대상 은 모두PyType_Type를 통 해 생 성 된다.PyType_TypePyTypeObject의 실례 이다.
  • PyType_Type은 유형 체제 에서 매우 중요 한 대상 으로 모든 유형의 유형 으로 원 유형 이 라 고 부른다.
  • 두 번 째 줄 코드PyType_Type에서 자신의ob_type필드 를 자신 에 게 가 리 킵 니 다.
  • 
    >>> type.__class__
    <class 'type'>
    >>> type.__class__ is type
    True
    따라서 float 를 예 로 들 면 더욱 완선 하지만 정확 하지 않 은 인 스 턴 스 대상 과 유형 대상 이 메모리 에 있 는 관계 도 를 그 릴 수 있 습 니 다.
    Alt
    2.유형의 기--PyBaseObjectType(object 의 실체)
    지난 절 에 빨간색 으로 표 시 된 문 구 는 사고 과정 에서object대상 의 존 재 를 소홀히 했 기 때문이다.object은 또 다른 특수 한 유형 으로 모든 유형의 기본 유형 이다.마찬가지 로PyFloat_Typetp_base필드 를 통 해 덩굴 을 따라 참 외 를 만 져 볼 수 있다.그러나 원본 코드 의 두 번 째 줄 에 있 는 PyVarObjectHEAD_INIT 정의 에서 이 필드 는 초기 화 되 지 않 았 습 니 다.
    
    0,                                          /* tp_base */
    코드PyFloat_Type에 나타 난 곳 을 더 찾 아 보면Object/object.c에서 다음 과 같은 코드 를 발견 할 수 있 습 니 다.
    
    if (PyType_Ready(&PyFloat_Type) < 0)
        Py_FatalError("Can't initialize float type");
    유형 대상 을 만 드 는 과정 에서PyType_Ready방법 으로tp_base필드 를 초기 화 해 야 합 니 다.구체 적 으로 다음 과 같 습 니 다.
    
    int
    PyType_Ready(PyTypeObject *type)
    {
        // ...
    
        base = type->tp_base;
        if (base == NULL && type != &PyBaseObject_Type) {
            base = type->tp_base = &PyBaseObject_Type;
            Py_INCREF(base);
        }
    
        // ...
    }
    
    PyFloat_Typetp_base필드 가 초기 화PyBaseObject_Type되 었 습 니 다.이것 은 object 뒤의 실체 입 니 다.그 소스 코드 는...
    
    PyTypeObject PyBaseObject_Type = {
        PyVarObject_HEAD_INIT(&PyType_Type, 0)
        "object",                                   /* tp_name */
        sizeof(PyObject),                           /* tp_basicsize */
        0,                                          /* tp_itemsize */
        object_dealloc,                             /* tp_dealloc */
    
        // ...
        object_repr,                                /* tp_repr */
    };
    
    원본 코드 에서ob_type필드 지향PyType_Type은 아래 object 가 Python 에서 의 테스트 코드 와 일치 합 니 다.
    
    >>> object.__class__
    <class 'type'>
    그 밖 에PyType_Ready함수 초기 화PyBaseObject_Type시 필드 를 설정 하지 않 습 니 다.상속 체인 은 반드시 종점 이 있어 야 하기 때문에,그렇지 않 으 면 상속 체인 을 따라 찾 을 때 사순환 에 빠 질 수 있다.
    
    >>> print(object.__base__)
    None
    이 를 통 해 인 스 턴 스 대상 과 유형 대상 이 메모리 에 있 는 완전한 관계 도 를 얻 었 다.float 를 예 로 들 면,
    Alt
    파 이 썬 소스 코드 학습 에 관 한 PyTypeType 과 PyBaseObjectType 상세 한 글 은 여기까지 입 니 다.더 많은 관련 PyTypeType 과 PyBaseObjectType 콘 텐 츠 는 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!

    좋은 웹페이지 즐겨찾기