数据结构

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. 关于矩阵最通俗的解释-超级经典zz

    线性代数课程,无论你从行列式入手还是直接从矩阵入手,从一开始就充斥着莫名其妙.比如说,在全国一般工科院系教学中应用最广泛的同济线性代数教材(现在到了第四版),一上来就介绍逆序数这个“前无古人,后无来者 ...

  2. JodaTime初体验

    前段时间用JDK自带的Calendar类来处理日期,需要获取年.季,月,星期的起始日期,被折腾得要死要活.看了这篇文章 http://www.blogbus.com/dreamhead-logs/22 ...

  3. Docker实例教程[超详细](一)

    Docker Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互 ...

  4. VS2012安装英文的语言包后,调试的时候提示Unknown error:0x80040d10

    https://social.msdn.microsoft.com/Forums/en-US/e11a86ef-3be2-4256-92e9-d12809f2a6ca/error-0x80040d10 ...

  5. OLAP、OLTP的介绍和比较

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

  6. 带你走进EJB--那些跟EJB容器相关的那些Java概念

    最近在对EJB的相关内容进行总结,在总结的过程中发现对容器的概念并不是很理解,因为EJB本身就是一个容器,但是容器到底是用来做什么的?它跟我们之前所了解的组件,框架,包,类等都有什么关系?接下来主要是 ...

  7. Codeforces Round #259 (Div. 2) C - Little Pony and Expected Maximum

    题目链接 题意:一个m个面的骰子,抛掷n次,求这n次里最大值的期望是多少.(看样例就知道) 分析: m个面抛n次的总的情况是m^n, 开始m==1时,只有一种 现在增加m = 2,  则这些情况是新增 ...

  8. bzoj1563

    P<=10一开始是吓死我了 后来想到这就是一个经典的决策单调性解决1d1d动态规划的题目 像决策单调性完全可以打表找规律,这里有一篇严谨的证明https://www.byvoid.com/blo ...

  9. iOS开发:Swift多线程NSOperation的使用

    介绍: NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理.NSOperation配合NSOperatio ...

  10. UVa 11572 Unique snowflakes【滑动窗口】

    题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素 看的紫书,滑动窗口来做的 当右端碰到有相同的数的时候,左端向前滑动一个数 模拟一个样例好理解些 #include<iostr ...