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 ...
随机推荐
- HTML5入门九---Canvas画布
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- 使用CAShapeLayer与UIBezierPath画出想要的图形
使用CAShapeLayer与UIBezierPath可以实现不在view的drawRect方法中就画出一些想要的图形 步骤: 1.新建UIBezierPath对象bezierPath 2.新建CAS ...
- 创业草堂之六:CEO的财务自修课
创业团队中一个最普遍的缺陷,是团队--尤其是团队的核心人物CEO,缺乏基本的财务知识和技能.一个不懂财务知识的CEO,即使业务能力再强,在投资人的眼里,他/她依然是一个笨拙的CEO.粗糙的CEO.鲁莽 ...
- QString转换成LPCWSTR
不知道大家用QT做什么程序,但应该还是Windows程序居多吧,仍免不了与WINAPI打交道.这就要求数据类型要与Windows一致,而QT的数据类型却是自成一体的.这就需要转换.比如我用到了Logo ...
- 01-语言入门-01-A+B Problem
题目地址: http://acm.nyist.net/JudgeOnline/problem.php?pid=1 描述 此题为练手用题,请大家计算一下a+b的值 输入 输入两个数,a,b 输 ...
- Proxifier设置代理
1.首先需要开启http代理选项---配置文件->高级->HTTP代理服务器,勾选“启用HTTP代理服务器支持” 2.然后开始添加代理服务器选择“配置文件->代理服务器”,在弹出框点 ...
- [原]用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验
本代码只是业余时间无聊写着试试,用WebBrowser组件模拟人工运行搜索引擎自动点击搜索结果的实验 这是网络中盛传的提高搜索引擎点击率的一种方式,当然属于作弊,不推荐各位使用.另外这种方式的性能不佳 ...
- CentOS5.5 正式开始安装 Oracle 11g r2(图形界面安装)
一.下载oracle 官方网站, 可以下载最新版本 Oracle Database 11g Release http://www.oracle.com/index.html CentOS5. i386 ...
- Math.sqrt
java.lang.Math.sqrt(double a) 返回正确舍入的一个double值的正平方根.特殊情况: 如果参数是NaN或小于为零,那么结果是NaN. 如果参数是正无穷大,那么结果为正无穷 ...
- Ionic开发中常见问题和解决方案记录
1npm按装包失败 更换源:npm config set registry https://registry.npm.taobao.org 或者使用cnpm sudo npm install -g c ...