Python对象初探
数据结构
PyObject_HEAD //对象公共头部
Py_ssize_t ob_refcnt; //对象引用数
PyTypeObject *ob_type; //对象类型
PyObject_VAR_HEAD //这个就是属于可变对象头部啦
PyObject_HEAD //对象头部
Py_ssize_t ob_size;//元素个数
展开了就是
PyObject_VAR_HEAD = {
Py_ssize_t ob_refcnt; //对象引用数
PyTypeObject *ob_type; //对象类型
Py_ssize_t ob_size;//元素个数
}
PyObject_HEAD_INIT(type) //不可变对象初始化
This is a macro which expands to initialization values for a new PyObject type. This macro expands to:
_PyObject_EXTRA_INIT
1, type,
//头部初始化,对象引入数初始化为1,对象类型为传入来的类型对象
PyVarObject_HEAD_INIT(type, size)¶//可变对象初始化
This is a macro which expands to initialization values for a new PyVarObject type, including the ob_size field. This macro expands to:
_PyObject_EXTRA_INIT
1, type, size,
//头部初始化,对象引入数初始化为1,对象类型为传入来的类型对象,大小为传进来的大小
而上面都有一个_PyObject_EXTRA_INIT
这个是因为系统定义了
Py_TRACE_REFS
所有要初始化 next和prev这两个指针

/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD /
_PyObject_HEAD_EXTRA /
int
ob_refcnt; /
struct
_typeobject
*ob_type;
#define PyObject_VAR_HEAD /
PyObject_HEAD /
int
ob_size;
/* Number of items in variable part */
不变对象定义
typedef struct _object {
PyObject_HEAD
} PyObject;
可变对象定义
typedef
struct
{
PyObject_VAR_HEAD
}
PyVarObject;
看书一定要仔细啊
类型对象的结构
[object.h]
typedef
struct
_typeobject
{
PyObject_VAR_HEAD
char
*tp_name;
/* For printing, in format "<module>.<name>" */
int
tp_basicsize, tp_itemsize;
/* For allocation */
/* Methods to implement standard operations */
destructor
tp_dealloc;
printfunc
tp_print;
……
/* More standard operations (here for binary compatibility) */
hashfunc
tp_hash;
ternaryfunc
tp_call;
……
}
PyTypeObject;
在_typeobject的定义中包含了许多的信息,主要可以分为四类:
1.类型名,tp_name,主要是Python内部以及调试的时候使用;
2.创建该类型对象是分配内存空间的大小的信息,即tp_basicsize和tp_itemsize;
3.与该类型对象相关联的操作信息,比如hashfunc,tp_hash就指明对于该类型的对象,如何生成其hash值。在Object.h中可以看到,hashfunc实际上是一个函数指针:typedef long (*hashfunc)(PyObject *); 在_typeobject中,包含了大量的函数指针,这些函数指针将用来指定某个类型的操作信息。这些操作主要分为标准操作(dealloc, print, compare),标准操作族(numbers, sequences, mappings),以及其他操作(hash, buffer, call…)。
接下来我们看看整形是如何初始化的
[intobject.c]
PyTypeObject
PyInt_Type
=
{
PyObject_HEAD_INIT(&PyType_Type)
0,
"int",
sizeof(PyIntObject),
……
};
PyType_Type这个又是什么东西啊
PyObject_HEAD_INIT 这个宏定义如下这样的,

PyType_Type 这个的数据结构是这样的,其实我觉得它是PyTypeObject的一个实例
[typeobject.c]
PyTypeObject
PyType_Type
=
{
PyObject_HEAD_INIT(&PyType_Type)
/*
上面宏展开就是
1 //引用计数
&PyType_Type
*/
0, /* ob_size 元素个数*/
"type", /* tp_name */
sizeof(PyHeapTypeObject), /* tp_basicsize */
sizeof(PyMemberDef), /* tp_itemsize */
……
PyObject_GC_Del, /* tp_free */
(inquiry)type_is_gc, /* tp_is_gc */
};
还是看源码好过
[intobject.h]
typedef
struct
{
PyObject_HEAD
/* 这里宏展开就是
Py_ssize_t ob_refcnt; //对象引用数
PyTypeObject *ob_type; //对象类型
*/
long
ob_ival;
}
PyIntObject;
PyTypeObject
PyInt_Type
=
{
PyObject_HEAD_INIT(&PyType_Type)
/*
这里宏展开就是
1 //引用计数
&PyType_Type //类型对象
*/
0, //元素个数
"int",
sizeof(PyIntObject),
0,
(destructor)int_dealloc, /* tp_dealloc */
(printfunc)int_print, /* tp_print */
0, /* tp_getattr */
0, /* tp_setattr */
(cmpfunc)int_compare, /* tp_compare */
(reprfunc)int_repr, /* tp_repr */
&int_as_number, /* tp_as_number */
0, /* tp_as_sequence */
0, /* tp_as_mapping */
(hashfunc)int_hash, /* tp_hash */
0, /* tp_call */
(reprfunc)int_repr, /* tp_str */
PyObject_GenericGetAttr, /* tp_getattro */
0, /* tp_setattro */
0, /* tp_as_buffer */
Py_TPFLAGS_DEFAULT
|
Py_TPFLAGS_CHECKTYPES
|
Py_TPFLAGS_BASETYPE, /* tp_flags */
int_doc, /* tp_doc */
0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
int_methods, /* tp_methods */
0, /* tp_members */
0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
0, /* tp_init */
0, /* tp_alloc */
int_new, /* tp_new */
(freefunc)int_free, /* tp_free */
};
到这里我们还没发现PyType_Type
这个东西有什么用

打印的方法
根本就没有用到那个属性
这个图还不错

Python对象初探的更多相关文章
- 《python解释器源码剖析》第1章--python对象初探
1.0 序 对象是python中最核心的一个概念,在python的世界中,一切都是对象,整数.字符串.甚至类型.整数类型.字符串类型,都是对象.换句话说,python中面向对象的理念观测的非常彻底,面 ...
- Python 3 初探,第 2 部分: 高级主题
Python 3 是 Guido van Rossum 功能强大的通用编程语言的最新版本.它虽然打破了与 2.x 版本的向后兼容性,但却清理了某些语法方面的问题.本文是这个由两部分组成的系列文章中的第 ...
- python征程3.0(python对象)
1.python使用对象模型来存储数据.构造任何类型的值都是一个对象.”尽管python被当成一种面向对象的脚本的编程语言“,但你完全能够写出不使用任何类和实例的脚本. python对象都拥有三个特性 ...
- 进击的Python【第一章】:Python背景初探与Python基础(一)
Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...
- python 对象
python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存.本文主要对Python的基本数据类型做简单的介绍. PyO ...
- Python 对象的引用计数和拷贝
Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...
- Python对象(译)
这是一篇我翻译的文章,确实觉得原文写的非常好,简洁清晰 原文链接:http://effbot.org/zone/python-objects.htm ------------------------- ...
- 《Python核心编程》 第四章 Python对象- 课后习题
练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到. 类型:对象的 ...
- Python对象体系揭秘
Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...
随机推荐
- WCF实例管理的三种方式
很多情况下,我们都需要控制wcf服务端对象的初始化方式,用来控制wcf实例在服务端的存活时间. Wcf框架提供了三种创建wcf实例的方式. WCF服务对象实例化基础 在普通的WCF请求和相应过程中,将 ...
- 转载:【译】Android: 自定义View
简介 每天我们都会使用很多的应用程序,尽管他们有不同的约定,但大多数应用的设计是非常相似的.这就是为什么许多客户要求使用一些其他应用程序没有的设计,使得应用程序显得独特和不同. 如果功能布局要求非常定 ...
- OpenRisc-52-run openrisc&orpmon on ml501 board
引言 之前关于openrisc的内容,几乎都是基于opencores官方的ordb2a那个开发板的,但是,实际情况是有那个板子的人不是很多,所以目前我在做一个与之类似的板子,并且很快就会跟大家见面,这 ...
- .net MVC APi调用
常用的调用方法为Get/Post Get方法: 服务器 public string Get(int id) { return "value"; } 这个直接在网页就可以测试,用 h ...
- Vim的可视模式
可视模式可以看到选中的字符串, 并对其进行操作 v:进入字符选择模式 V:进入行选择模式 ctrl-v(Window是ctrl-q):进入block选择模式 o:移动光标到选择的另一端 O:移动光标到 ...
- 【转载】git命令和svn的对比
首先,要明确的是,git和svn是完全不同的两种管理方式.他们的命令不是完全对等的. 下面只是一些相似方法的参考,而已. 参考 http://blog.csdn.net/chen198746/arti ...
- Android查询:模拟键盘鼠标事件(adb shell 实现)
1. 发送键盘事件: 命令格式1:adb shell input keyevent “value” 其中value以及对应的key code如下表所列: KeyEvent Value KEYCODE ...
- Mac系统在终端中查看CPU信息的命令
在mac os x的终端中以命令行的形式查看本机cpu信息: sysctl -n machdep.cpu.brand_string E.G. lis-mbp:Home jenkins$ sysctl ...
- 函数get_table_share
得到一个table_share 1)先从table_def_cache中查找, 如果有, 直接返回 2)如果没有找到, 为table_share分配内存,初始化,打开.frm文件,并将share ...
- ASP.NET线程相关配置
1.(maxWorkerThreads * CPU逻辑数量)-minFreeThreads 比如2个CPU默认配置maxWorkerThreads=100,minFreeThreads=176,则同时 ...