py一切皆對象:
那么Type也是個對象。對象類型叫PyTypeObject
demo
>>> a = 1
>>> a
1
>>> type(a)
<type 'int'> int類型
#等價的兩個
>>> type(int) int類型的類型就是type
<type 'type'>
>>> type(type(a)) type(a)是int類型的類型就是type
<type 'type'>
#還是等價的兩個
>>> type(type(int))
<type 'type'>
>>> type(type(type(a)))
<type 'type'>
# 1. int 的 類型 是`type`
>>> type(int)
<type 'type'>
# 2. type 的類型 還是`type`, 對應上面說明第二點
>>> type(type(int))
<type 'type'>
1. 首先, 定義一種類型對象叫PyTypeObject
定義
typedef struct _typeobject {
/* MARK: base, 注意, 是個變長對象*/
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */ //類型名
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;
說明
- PyObject_VAR_HEAD 變長對象
- const char *tp_name tp_name, 類型名字符串數組
- 所有Type對象都是PyTypeObject的”實例”:
- 比如int類型:PyType_Type/PyInt_Type
2. 然后, 用PyTypeObject初始化得到一個對象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 */
// type對象的方法和屬性初始化值
.....
};
說明
- tp_name
類型名, 這里是”type”- PyVarObject_HEAD_INIT(&PyType_Type, 0)
PyVarObject_HEAD_INIT, 這個方法在 Include/object.h中,
等價於
ob_refcnt = 1
*ob_type = &PyType_Type
ob_size = 0
即, PyType_Type的類型是其本身!
3. 再然后, 定義具體的類型, 這里以PyInt_Type為例子
定義
PyTypeObject PyInt_Type = {
PyVarObject_HEAD_INIT(&PyType_Type, 0)
"int",
sizeof(PyIntObject),
0,
// int類型的相關方法和屬性值
....
(hashfunc)int_hash, /* tp_hash */
};
說明
- “int”
PyInt_Type的類型名是int- PyVarObject_HEAD_INIT(&PyType_Type, 0)
PyInt_Type的
*ob_type = &PyType_Type
使用
>>> type(1)
<type 'int'>
>>> type(type(1))
<type 'type'>
4. 最后, 生成一個整數對象int
定義
typedef struct {
PyObject_HEAD
long ob_ival;
} PyIntObject;
結構

- PyIntObject為整數類型
- 聲明一個整數后得到整數對象
- 對象ob_type指向PyInt_type對象
=========================
總結:
- 一切都是對象 什么都是PyObject/PyVarObject對象
- PyType_Type / PyInt_Type / PyString_Type ….等
這些是類型對象, 可以認為是同級, 都是PyTypeObject這種類型的實例!- 雖然是同級,
但是其他PyXXX_Type, 其類型指向 PyType_Type
PyType_Type 的類型指向自己, 它是所有類型的類型- PyTypeObject 是一個變長對象
- 每個object, 例如PyIntObject都屬於一種
類型
object初始化時進行關聯


