Python 소스 학습 의 PyTypeType 과 PyBaseObject유형 상세 설명
PyObject 와 PyTypeObject내용 의 마지막 부분 에서 다음 그림 에서 사례 대상 과 유형 대상 에 대한 이해 가 정확 하지 않다 고 지적 했다.
부동 소수점 형식 대상 은 전역 에서 유일 합 니 다.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_type
및ob_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_Type
는PyTypeObject
의 실례 이다.PyType_Type
은 유형 체제 에서 매우 중요 한 대상 으로 모든 유형의 유형 으로 원 유형 이 라 고 부른다.PyType_Type
에서 자신의ob_type
필드 를 자신 에 게 가 리 킵 니 다.
>>> type.__class__
<class 'type'>
>>> type.__class__ is type
True
따라서 float 를 예 로 들 면 더욱 완선 하지만 정확 하지 않 은 인 스 턴 스 대상 과 유형 대상 이 메모리 에 있 는 관계 도 를 그 릴 수 있 습 니 다.2.유형의 기--PyBaseObjectType(object 의 실체)
지난 절 에 빨간색 으로 표 시 된 문 구 는 사고 과정 에서
object
대상 의 존 재 를 소홀히 했 기 때문이다.object
은 또 다른 특수 한 유형 으로 모든 유형의 기본 유형 이다.마찬가지 로PyFloat_Type
중tp_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_Type
의tp_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 를 예 로 들 면,파 이 썬 소스 코드 학습 에 관 한 PyTypeType 과 PyBaseObjectType 상세 한 글 은 여기까지 입 니 다.더 많은 관련 PyTypeType 과 PyBaseObjectType 콘 텐 츠 는 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 도 많은 응원 부 탁 드 리 겠 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.