这篇主要涉及Python对象的类型机制
有点绕, 一定要思维清晰的时候再看哦:)
一个例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>> a = 1 >>> a 1 >>> type(a) #等价的两个 >>> type(type(a)) >>> type(int) #还是等价的两个 >>> type(type(type(a))) >>> type(type(int)) |
我们反向推导一个int
对象是怎么生成的.
1. 首先, 定义一种类型叫PyTypeObject
代码位置 Include/object.h
定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
typedef struct _typeobject { /* MARK: base, 注意, 是个变长对象*/ PyObject_VAR_HEAD const char *tp_name; /* For printing, in format "." */ //类型名 Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ // 创建该类型对象时分配的内存空间大小 // 一堆方法定义, 函数和指针 /* Methods to implement standard operations */ printfunc tp_print; hashfunc tp_hash; /* Method suites for standard classes */ PyNumberMethods *tp_as_number; // 数值对象操作 PySequenceMethods *tp_as_sequence; // 序列对象操作 PyMappingMethods *tp_as_mapping; // 字典对象操作 // 一堆属性定义 .... } PyTypeObject; |
说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
1. tp_name 类型名, 这里是"type" 2. PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT, 这个方法在 Include/object.h中, 等价于 ob_refcnt = 1 *ob_type = &PyType_Type ob_size = 0 即, PyType_Type的类型是其本身!1. tp_name 类型名, 这里是"type" 2. PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT, 这个方法在 Include/object.h中, 等价于 ob_refcnt = 1 *ob_type = &PyType_Type ob_size = 0 即, PyType_Type的类型是其本身! |
所有Type都是PyTypeObject的”实例”: PyType_Type/PyInt_Type
2. 然后, 用PyTypeObject初始化得到一个对象PyType_Type
代码位置 Objects/typeobject.c
定义
1 2 3 4 5 6 7 8 9 10 11 |
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 */ // type对象的方法和属性初始化值 ..... }; |
yntax Highlighter v2.7.1.1 -->
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>> a = 1 >>> a 1 >>> type(a) #等价的两个 >>> type(type(a)) >>> type(int) #还是等价的两个 >>> type(type(type(a))) >>> type(type(int)) |
我们反向推导一个int
对象是怎么生成的.
1. 首先, 定义一种类型叫PyTypeObject
代码位置 Include/object.h
定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
typedef struct _typeobject { /* MARK: base, 注意, 是个变长对象*/ PyObject_VAR_HEAD const char *tp_name; /* For printing, in format "." */ //类型名 Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ // 创建该类型对象时分配的内存空间大小 // 一堆方法定义, 函数和指针 /* Methods to implement standard operations */ printfunc tp_print; hashfunc tp_hash; /* Method suites for standard classes */ PyNumberMethods *tp_as_number; // 数值对象操作 PySequenceMethods *tp_as_sequence; // 序列对象操作 PyMappingMethods *tp_as_mapping; // 字典对象操作 // 一堆属性定义 .... } PyTypeObject; |
说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
1. tp_name 类型名, 这里是"type" 2. PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT, 这个方法在 Include/object.h中, 等价于 ob_refcnt = 1 *ob_type = &PyType_Type ob_size = 0 即, PyType_Type的类型是其本身!1. tp_name 类型名, 这里是"type" 2. PyVarObject_HEAD_INIT(&PyType_Type, 0) PyVarObject_HEAD_INIT, 这个方法在 Include/object.h中, 等价于 ob_refcnt = 1 *ob_type = &PyType_Type ob_size = 0 即, PyType_Type的类型是其本身! |
所有Type都是PyTypeObject的”实例”: PyType_Type/PyInt_Type
2. 然后, 用PyTypeObject初始化得到一个对象PyType_Type
代码位置 Objects/typeobject.c
定义
1 2 3 4 5 6 7 8 9 10 11 |
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 */ // type对象的方法和属性初始化值 ..... }; |
h"> /span>span class="crayon-v">gameobjects/span>span class="crayon-sy">./span>span class="crayon-e">vector3 /span>span class="crayon-r">import/span>span cla