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 ...
随机推荐
- linux上应用程序的执行机制
linux上应用程序的执行机制 执行文件是如何在shell中被"执行"的.本文中尽可能少用一些源码,免得太过于无 聊,主要讲清这个过程,感兴趣的同学可以去查看相应的源码了解更多的信 ...
- 用javascript编写的简单计算器
老师布置的任务,弄了一天,总算把代码搞出来了,作为菜鸟给自己一点小掌声,传说中JS是很简单的,但是要写出一个程序真的很需要锻炼,我的锻炼实在是太少了,天天DOTA中.呵呵(做了些小注释)大家应该能看懂 ...
- MFC、WTL、WPF、wxWidgets、Qt、GTK、Cocoa、VCL 各有什么特点?
WTL都算不上什么Framework,就是利用泛型特性对Win API做了层封装,设计思路也没摆脱MFC的影响,实际上用泛型做UI Framework也只能算是一次行为艺术,这个思路下继续发展就会变得 ...
- redis twitter
http://redis.io/topics/twitter-clone 翻译:http://my.oschina.net/Twitter/blog/287539
- java--面向抽象编程
所谓面向抽象编程是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,及所设计类中的重要数据是抽象类声明的对象,而不是具体类声明的对象.就是利用abstract来设计实现用户需求. 比如:我 ...
- orzdba在5.6安装
前言:淘宝的orzdba查看MySQL服务器当前QPS,TPS很方便,但是不少人反应,在5.6原本好用的工具不好用了,频繁出现这样警告: Warning: Using a password on th ...
- flume介绍以及环境的部署
收集.聚合时间流数据分布式框架.通常用户log数据 采用ad-hoc方案,明显有点如下: 可靠的.可伸缩.可管理.可定制.高性能 声名式配置,可以动态配置 提供上下文路由功能 支持负载均衡和故障转移 ...
- BZOJ 3123 森林(函数式线段树)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=3123 题意: 思路:总的来说,查询区间第K小利用函数式线段树的减法操作.对于两棵树的合并 ...
- CodeForces Round #278 (Div.2) (待续)
A 这么简单的题直接贴代码好了. #include <cstdio> #include <cmath> using namespace std; bool islucky(in ...
- EF 更新指定的字段
假如你有个表,有30个字段,你只想更新其中的1到2个字段的话,就可以用得上这篇文章 作用:类似于我们以前的sql代码 update xxx表 set name='ok',pwd='ok' where ...