这篇主要涉及Python对象的类型机制
有点绕, 一定要思维清晰的时候再看哦:)
一个例子
123456789101112131415 | >>> a = 1>>> a1 >>> type(a) #等价的两个>>> type(type(a)) >>> type(int) #还是等价的两个>>> type(type(type(a))) >>> type(type(int)) |
我们反向推导一个int
对象是怎么生成的.
代码位置 Include/object.h
定义
123456789101112131415161718192021 | 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; |
说明
123456789101112131415161718192021 | 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
代码位置 Objects/typeobject.c
定义
1234567891011 | 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对象的方法和属性初始化值 ..... }; |
123456789101112131415 | >>> a = 1>>> a1 >>> type(a) #等价的两个>>> type(type(a)) >>> type(int) #还是等价的两个>>> type(type(type(a))) >>> type(type(int)) |
我们反向推导一个int
对象是怎么生成的.
代码位置 Include/object.h
定义
123456789101112131415161718192021 | 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; |
说明
123456789101112131415161718192021 | 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
代码位置 Objects/typeobject.c
定义
1234567891011 | 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对象的方法和属性初始化值 ..... }; |