[Python源码学习]之数据类型
标准类型层次
根据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'>
参考
[*]
http://docs.python.org/reference/datamodel.html#types
页:
[1]