《Python 源码阅读》之 类型Type
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初始化时进行关联
《Python 源码阅读》之 类型Type的更多相关文章
- PYTHON 源码阅读
http://www.wklken.me/posts/2015/09/29/python-source-gc.html http://www.wklken.me/archives.html https ...
- FreeCAD源码阅读笔记
本文目标在于记录在FreeCAD源码阅读中了解到的一些东西. FreeCAD编译 FreeCAD源码的编译最好使用官方提供的LibPack,否则第三方库难以找全,找到之后还需要自己编译,此外还不知道C ...
- python3 源码阅读-虚拟机运行原理
阅读源码版本python 3.8.3 参考书籍<<Python源码剖析>> 参考书籍<<Python学习手册 第4版>> 官网文档目录介绍 Doc目录主 ...
- 【原】FMDB源码阅读(二)
[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...
- 读python源码--对象模型
学python的人都知道,python中一切皆是对象,如class生成的对象是对象,class本身也是对象,int是对象,str是对象,dict是对象....所以,我很好奇,python是怎样实现这些 ...
- [PHP源码阅读]explode和implode函数
explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...
- 源码阅读系列:EventBus
title: 源码阅读系列:EventBus date: 2016-12-22 16:16:47 tags: 源码阅读 --- EventBus 是人们在日常开发中经常会用到的开源库,即使是不直接用的 ...
- EventBus源码解析 源码阅读记录
EventBus源码阅读记录 repo地址: greenrobot/EventBus EventBus的构造 双重加锁的单例. static volatile EventBus defaultInst ...
- 36 网络相关函数(四)——live555源码阅读(四)网络
36 网络相关函数(四)——live555源码阅读(四)网络 36 网络相关函数(四)——live555源码阅读(四)网络 简介 7)createSocket创建socket方法 8)closeSoc ...
随机推荐
- Github 协同开发
ithub开发流程 Github的流程.也就是: 开发者各自fork项目的repo到自己Github账户下 每次开发同步到项目的repo然后再进行开发 push自己的开发分支到自己Github账户下面 ...
- C++中值传递(pass-by-value)和引用传递(pass-by-reference)
1.pass-by-value的情况: 缺省情况C++以pass-by-value(继承C的方式)传递对象至(或来自)函数.函数参数都是以实际参数的复件为初值,调用端所获得的也是函数返回值的一个复件, ...
- Splay树
class SplayNode { public: SplayNode *child[]; char value; int size; bool flip; SplayNode(), flip(fal ...
- [Offer收割]编程练习赛38
漏写的数字 #pragma comment(linker, "/STACK:102400000,102400000") #include<stdio.h> #inclu ...
- JS网站图集相册特效
JS网站图集相册特效是一款可以直接使用鼠标进行前后导航,也可以通过缩略图来切换图片. 在线演示本地下载
- IDEA导入个性化主题的方法
IDEA的主题可以自定义,也可从网上下载 http://www.riaway.com/theme.php 喜欢的主题,保存到本地. 主题是一个jar的包.导入到idea的方法如下: file –> ...
- matplotlib显示中文字体
原始地址:http://zanyongli.i.sohu.com/blog/view/195716528.htm matplotlib 1.0.0版 对于3.0的可能不太适用,要注意语法结构! C:/ ...
- UVa修改版02
#include<stdio.h> int main() { int i,k=-1,t; char a[100]; scanf("%d",&t); while( ...
- 后代children() find()的区别
$(document).ready(function(){ $("div").children(); });只拿到div下面的子标签元素 $(document).ready(fun ...
- HILLSTONE sg6000 g5150 怎么恢复出厂设置
hillstone恢复出厂设置的方法(忘记密码的情况) 口令丢失情况下的处理 如果口令丢失,用户无法登录安全路由器进行配置,请在安全路由器刚启动时按住 CLR 按键大约 5 秒,使设备恢复到出厂配置. ...

