数据结构

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. 汉诺塔算法的递归与非递归的C以及C++源代码

    汉诺塔(又称河内塔)问题其实是印度的一个古老的传说. 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一 个小, ...

  2. [Unity菜鸟] FBX模型动画提取

    角色已经人形化(Humanoid)了,那它的动画可以用在其它的模型上了也就是可以共用一套模型动画了,但是你有没有发现那动画是和fbx模型绑在一起的,没关系你可以选中这几个动画文件按Contrl+D就可 ...

  3. ArcGIS 10 影像去黑边

    在作卫片执法项目中,需要多个影像叠加截图,这就会出现影像黑边叠加的情况,这时就需要对多幅影像进行处理.主要有两种处理方式:以ArcGIS10.1为例,操作如下:     1.acrtoolbox——& ...

  4. Android The content of the adapter has changed but ListView did not receive a notification终极解决方法

    这几天做一个自动扫描SD卡上所有APK文件的小工具,扫描过程中会把APK添加到LISTVIEW中显示,结果出现以下错误:(有时候触摸更新数据时候,触摸listview也会报错) E/AndroidRu ...

  5. URAL 1957 Wrong Answer 暴力

    Wrong Answer 思路: 1.先枚举4的全排列,即球赛的所有可能结果,一共4!=24种情况 2.对于每种情况,DFS 未确定的比赛 的结果,判断这种情况是否可达. 剪枝: 1.对于每种全排列, ...

  6. MariaDB10.2.X-新特性1-支持分析函数

    前言:前段时间看到MariaDB10.2出测试版本了,心想有什么新特性玩玩,大家都知道MySQL不支持分析函数,但是MariaDB10.2.X支持分析函数了, 1.表结构 CREATE TABLE ` ...

  7. ios越狱开发第一次尝试记录

    1.THEOS的makefile文件中的THEOS_DEVICE_IP要写在第一行 2.如果make package install报错 dpkg status database is locked ...

  8. WebService只能在本地使用,无法通过网络访问的解决办法

    问题描述:WebService只能在本地使用,无法通过网络访问. 解决方案:在web.config的<system.web></system.web>中间加入如下配置节内容: ...

  9. eclipse启动出现“An Error has Occurred. See the log file”解决方法

    最近在启动eclipse时出现了“An Error has Occurred. See the log file”的错误,点击确定后也不能启动eclipse.查看log文件,出现类似: java.la ...

  10. td内容自动换行 ,td超过宽度显示点点点… , td 使用 overflow:hidden 无效,英文 数字 不换行 撑破div容器

    我们可以先给表格 table上 固定一个宽度 不让表格撑破 width: 747px; table-layout:fixed; 然后我们在td上加上如下样式 style="width:100 ...