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 ...
随机推荐
- 模拟在table中移动鼠标,高亮显示鼠标所在行
在项目中有这样一个需求,在table中移动鼠标时,鼠标所在行高亮显示,其他行正常显示,为此做了一个模拟. 具体代码如下: <!DOCTYPE html> <html xmlns=&q ...
- 机器学习 —— 概率图模型(学习:CRF与MRF)
在概率图模型中,有一类很重要的模型称为条件随机场.这种模型广泛的应用于标签—样本(特征)对应问题.与MRF不同,CRF计算的是“条件概率”.故其表达式与MRF在分母上是不一样的. 如图所示,CRF只对 ...
- 【C#设计模式——创建型模式】简单工场模式
进入码农行列也有一年半载了,仍然感觉自己混混沌沌,无所事事,无所作为,,,想想都下气,下气归下气,仍要奋起潜行,像愤怒的小鸟一边又一遍的冲向猪头也好,像蜗牛一样往前蹭也罢,总之要有蚂蚁啃骨头的精神!! ...
- 使用设置报头x-Frame-Options限制iframe网页嵌套
x-frame-options的出现一部分是为了防止一些别有用心的者制作钓鱼网站,现在支持的浏览器有一下: chrome 4.1.249.1042 firefox 3.6.9(1.9.2.9) IE ...
- Codeforces Beta Round #9 (Div. 2 Only)D
短小精悍的代码 dp[i][j] +=dp[k][j-1]*[i-k-1][j-1] i个结点 J层 #include <iostream> #include<cstdio> ...
- 1242. Werewolf(dfs)
1242 简单dfs 往孩子方向搜一遍 父母方向搜一遍 输入还搞什么字符串.. #include <iostream> #include<cstdio> #include< ...
- Activity的加载模式及Intent.setFlags
在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity.可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity. ...
- IIS大数据请求设置方法
大并发大数据量请求一般会分为几种情况: 1.大量的用户同时对系统的不同功能页面进行查找,更新操作 2.大量的用户同时对系统的同一个页面,同一个表的大数据量进行查询操作 3.大量的用户同时对系统的同一个 ...
- java分层架构概念
转自:http://www.cnblogs.com/bdqnbenet/p/4924778.html service是业务层 DAO (Data Access Object) 数据访问 1.JAVA中 ...
- xcode6.3 编译ffmpeg 2.6.3(已验证编译成功)
1.解压ffmpeg2.6.3源代码,在根目录下新建文件myconfig,内容如下,执行命令chmod 777 ./myconfig 2../myconfig 3.make 4.make instal ...