PYTHON 源码阅读 – 类型
admin
2023-07-31 00:36:18
0

这篇主要涉及Python对象的类型机制

有点绕, 一定要思维清晰的时候再看哦:)


一个例子

123456789101112131415 >>> a = 1>>> a1 >>> type(a) #等价的两个>>> type(type(a)) >>> type(int) #还是等价的两个>>> type(type(type(a))) >>> type(type(int))

我们反向推导一个int对象是怎么生成的.


1. 首先, 定义一种类型叫PyTypeObject

代码位置 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


2. 然后, 用PyTypeObject初始化得到一个对象PyType_Type

代码位置 Objects/typeobject.c

定义

yntax Highlighter v2.7.1.1 –>

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对象是怎么生成的.


1. 首先, 定义一种类型叫PyTypeObject

代码位置 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


2. 然后, 用PyTypeObject初始化得到一个对象PyType_Type

代码位置 Objects/typeobject.c

定义

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

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对象的方法和属性初始化值  ..... };

相关内容

热门资讯

Mobi、epub格式电子书如... 在wps里全局设置里有一个文件关联,打开,勾选电子书文件选项就可以了。
500 行 Python 代码... 语法分析器描述了一个句子的语法结构,用来帮助其他的应用进行推理。自然语言引入了很多意外的歧义,以我们...
定时清理删除C:\Progra... C:\Program Files (x86)下面很多scoped_dir开头的文件夹 写个批处理 定...
scoped_dir32_70... 一台虚拟机C盘总是莫名奇妙的空间用完,导致很多软件没法再运行。经过仔细检查发现是C:\Program...
65536是2的几次方 计算2... 65536是2的16次方:65536=2⁶ 65536是256的2次方:65536=256 6553...
小程序支付时提示:appid和... [Q]小程序支付时提示:appid和mch_id不匹配 [A]小程序和微信支付没有进行关联,访问“小...
pycparser 是一个用... `pycparser` 是一个用 Python 编写的 C 语言解析器。它可以用来解析 C 代码并构...
微信小程序使用slider实现... 众所周知哈,微信小程序里面的音频播放是没有进度条的,但最近有个项目呢,客户要求音频要有进度条控制,所...
Apache Doris 2.... 亲爱的社区小伙伴们,我们很高兴地向大家宣布,Apache Doris 2.0.0 版本已于...
python清除字符串里非数字... 本文实例讲述了python清除字符串里非数字字符的方法。分享给大家供大家参考。具体如下: impor...