数据结构

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对象初探的更多相关文章

  1. 《python解释器源码剖析》第1章--python对象初探

    1.0 序 对象是python中最核心的一个概念,在python的世界中,一切都是对象,整数.字符串.甚至类型.整数类型.字符串类型,都是对象.换句话说,python中面向对象的理念观测的非常彻底,面 ...

  2. Python 3 初探,第 2 部分: 高级主题

    Python 3 是 Guido van Rossum 功能强大的通用编程语言的最新版本.它虽然打破了与 2.x 版本的向后兼容性,但却清理了某些语法方面的问题.本文是这个由两部分组成的系列文章中的第 ...

  3. python征程3.0(python对象)

    1.python使用对象模型来存储数据.构造任何类型的值都是一个对象.”尽管python被当成一种面向对象的脚本的编程语言“,但你完全能够写出不使用任何类和实例的脚本. python对象都拥有三个特性 ...

  4. 进击的Python【第一章】:Python背景初探与Python基础(一)

    Python背景初探 一.Python起源 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做 ...

  5. python 对象

    python 对象 在python中,对象就是为C中的结构体在堆上申请的一块内存,一般来说,对象是不能被静态初始化的,并且不能再栈空间上生存.本文主要对Python的基本数据类型做简单的介绍. PyO ...

  6. Python 对象的引用计数和拷贝

    Python 对象的引用计数和拷贝 Python是一种面向对象的语言,包括变量.函数.类.模块等等一切皆对象. 在python中,每个对象有以下三个属性: 1.id,每个对象都有一个唯一的身份标识自己 ...

  7. Python对象(译)

    这是一篇我翻译的文章,确实觉得原文写的非常好,简洁清晰 原文链接:http://effbot.org/zone/python-objects.htm ------------------------- ...

  8. 《Python核心编程》 第四章 Python对象- 课后习题

    练习 4-1. Python对象.与所有Python对象有关的三个属性是什么?请简单的描述一下. 答:身份.类型和值: 身份:每一个对象都有一个唯一的身份标识自己,可以用id()得到.  类型:对象的 ...

  9. Python对象体系揭秘

    Guido用C语言创造了Python,在Python的世界中一切皆为对象. 一.C视角中的Python对象 让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://doc ...

随机推荐

  1. Linux Shell脚本入门:tee命令

    用途说明   在执行Linux命令时,我们可以把输出重定向到文件中,比如 ls >a.txt,这时我们就不能看到输出了,如果我们既想把输出保存到文件中,又想在屏幕上看到输出内容,就可以使用tee ...

  2. android4.4.2内核移植3.4.1

    01◑ 内核源码总目录下Makefile文件修改: 195行: ARCH ?= $(SUBARCH)替换成: ARCH ?= arm 02◑ arch/arm下makefile: ①差7行 # tes ...

  3. OLAP、OLTP的介绍和比较

    OLTP与OLAP的介绍 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing).联机分析处理OLAP(On-Line Analytical ...

  4. Codeforces Round #205 (Div. 2)

    A #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  5. unique() 去重函数

    unique()函数是一个去重函数,STL中unique的函数 unique的功能是去除相邻的重复元素(只保留一个), 还有一个容易忽视的特性是它并不真正把重复的元素删除.他是c++中的函数, 所以头 ...

  6. MVC的项目使用html编辑器UEditorMINI

    一个MVC的项目中有个发布新闻的页面需要用到一个html的编辑器,网上看到UEditor评价貌似还不错, 因为我用到的功能比较简单,就下载了MINI版本的, 使用的过程在这里总结一下. 关于UEdit ...

  7. LA 3266 (贪心) Tian Ji -- The Horse Racing

    题意: 田忌和齐王各有n匹马,如果马的速度比齐王的快就赢200,慢则输200,相等不赔不赚. 已知两人每匹马的速度(为整数)和齐王所排出的马的顺序,问田忌该如何应对才能使收益最大. 分析: 本以为是一 ...

  8. HDU 1425 sort 【哈希入门】

    题意:给出n个数,输出前m大的数 和上一题一样,将输入的数加上一个极大地值作为地址 #include<iostream> #include<cstdio> #include&l ...

  9. 自定义ShareDialog视图

    1. share_item.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayou ...

  10. 门户网站架构Nginx+Apache+MySQL+PHP+Memcached+Squid

    服务器的大用户量的承载方案 一.前言二.编译安装三. 安装MySQL.memcache四. 安装Apache.PHP.eAccelerator.php-memcache五. 安装Squid六.后记 一 ...