标准类型层次
根据Manual中The standard type hierarchy一节的类型信息,我们首先尝试列出一个表:
类型 | 对象类 | |||
PyNone_Type | PyObject | None | ||
PyBool_Type | PyLongObject | NotImplemented | ||
PyEllipsis_Type | PyObject | Ellipsis | ||
PyLone_Type | PyLongObject | numbers.Integral | numbers.Number | |
PyFloat_Type | numbers.Real | |||
PyComplex_Type | numbers.Complex | |||
PyUnicode_Type | PyUnicodeObject | Strings | Sequences | |
PyTuple_Type | Tuples | |||
PyBytes_Type | PyBytesObject | Bytes | ||
PyList_Type | Lists | |||
PyByteArray_Type | Byte Arrays | |||
PySet_Type | Sets | Set | ||
PyTraceBack_Type | Frozen sets | |||
PyDict_Type | Dictionaries | Mappings | ||
PyFunction_Type | PyFunctionObject | 用户自定义函数 | Callable types | |
PyInstanceMethod_Type | PyInstanceMethodObject | 实例的方法 | ||
生成器函数 | ||||
PyCFunction_Type | PyCFunctionObject | 内置函数 | ||
内置方法 | ||||
类 | ||||
类实例 | ||||
PyModule_Type | Modules | |||
Custom class | ||||
Class instances | ||||
I/O objects | ||||
PyCode_Type | Code objects | Internal types | ||
PyFrame_Type | Frame objects | |||
PyTraceBack_Type | Traceback objects | |||
PySlice_Type | PySliceObject | Slice objects | ||
PyStaticMethod_Type | staticmethod | Static method objects | ||
PyClassMethod_Type | classmethod | Class method objects |
刚开始接触这个东西,很多地方还不了解,以至于这个简单的表格都无法补全(留待以后慢慢完善)
Py***_Type
这些都是结构体PyTypeObject的实例,以PyLong_Type为例:
- 变量声明在 Inlcude/longobject.h 中:
PyAPI_DATA(PyTypeObject) PyLong_Type;
- 注:PyAPI_DATA是一个宏,定义在 Include/pyport.h 中,用来隐藏动态库时平台的差异,片段如下:
... #define PyAPI_FUNC(RTYPE) __declspec(dllexport) RTYPE #define PyAPI_DATA(RTYPE) extern __declspec(dllexport) RTYPE ...
- 变量定义在 Object/longobject.c 中:
PyTypeObject PyLong_Type = { PyVarObject_HEAD_INIT(&PyType_Type, 0) "int", /* tp_name */ offsetof(PyLongObject, ob_digit), /* tp_basicsize */ sizeof(digit), /* tp_itemsize */ long_dealloc, /* tp_dealloc */ ... &long_as_number, /* tp_as_number */ ... long_new, /* tp_new */ PyObject_Del, /* tp_free */ };
-
PyTypeObject本身也是一个PyObject,所以它也有自己的类型,这就是PyType_Type
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 */ ...
- 类型信息在Python中通过type来获取
>>> type(0L) <type 'long'> >>> type(long) <type 'type'> >>> type(type) <type 'type'>