Python对象体系深入分析


Posted in Python onOctober 28, 2014

本文较为详细的分析了了Python的对象体系。分享给大家供大家参考。具体如下:

Guido用C语言创造了Python,在Python的世界中一切皆为对象.

一.C视角中的Python对象

让我们一起追溯到源头,Python由C语言实现,且向外提供了C的API http://docs.python.org/c-api/index.html .

我们思考问题的时候,可能对于对象这种东西很容易理解,而计算机能理解的只有0,1序列这样的字节序列,从根本上讲,我们所说的计算机语言中的对象只是在内存中的一块内存空间里的0,1序列而已,这些连续或者非连续的内存空间在更高层次上可以看作是一个整体.在Python中,我们所提到的一般的对象都是C中的结构体在堆Heap上申请的一块内存空间.

为了能够用C语言实现Python的面向对象的机制,需要定义一些结构体,能够操作那些对象的内存空间。

1.PyObject&PyVarObject

所有的Python对象都有一些共同的东西,我们将其高度抽象成一个结构体PyObject

typedef struct _object{  

    PyObject_HEAD  

} PyObject;  

//其实PyObject_HEAD这个宏在发行版本中的为  

int ob_refcnt;  

struct _typeobject *ob_type;

ob_refcnt,就是对象引用计数,它的存在是为了实现了Python的基于引用技术的垃圾回收机制.

还有一个是指向一个类型对象结构体的指针,用以代表该对象的类型.

在C语言的实现的时候,还有一个结构体扩展于PyObject

那便是PyVarObject,其内容为PyObject_VAR_HEAD这个宏,它比PyObject多了一个ob_size,用来表示变长对象的长度,详情见http://docs.python.org/c-api/structures.html

还有一点请大家不要搞混,这里的PyObject和PyVarObject和Python世界中的真实对象没有对应关系,这两个只是Python对象全体在C语言表示中的一种抽象.也就是说在C语言中,只要是一个Python对象结构体的数据,那么其内存的开始部分都会有上面结构体的几个变量,所以一个PyObject的指针便可以指向所有的C语言中的表示Python对象的结构体,这样在C语言的实现中,我们便可以通过这个统一的指针操作所有的内置的Python对象结构体了.

2.PyTypeObject

刚刚还有一个东西没有讲,那便是_typeobject(PyTypeObject)这个结构体,它是Python中所有类型对象的抽象,这样我们在C语言的层次里对于所有的类型对象结构体都可以通过PyTypeObject的指针来调用

typedef struct _typeobject {  

//注意开始部分为PyObject_VAR_HEAD  

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;

3.Python内置对象和C结构体的对应

现在Python面向对象机制的对象和类型的抽象都已经说过了,接下来我们来看下在python中真实存在的对象在C语言实现的时候是怎么样的呢?

首先需要谈的是那些Python的内置对象,这些都是C语言定义了的,当Python环境初始化后,这些对象便创建好了。

PyAPI_DATA(PyTypeObject) PyType_Type; /* built-in 'type' */  

PyAPI_DATA(PyTypeObject) PyBaseObject_Type; /* built-in 'object' */

object对象在Python中是一个比较基础的对象,它在C语言中对应的结构体是PyBaseObject_Type,从C语言中的这个命名我们可以大概知道这个类是一个类型对象.

还有就是Python中的<type 'type'>在C语言中对应着PyType_Type

PyTypeObject PyType_Type = {  

PyObject_HEAD_INIT(&PyType_Type)  

0, /* ob_size */  

"type", /* tp_name */  

sizeof(PyHeapTypeObject), /* tp_basicsize */  

sizeof(PyMemberDef), /* tp_itemsize */  

……  

};

我们再看看比较具体的整数

一个整数instance在C语言中的表示的结构体是PyIntObject

typedef struct {  

PyObject_HEAD  

long ob_ival;  

} PyIntObject;
 

也就是说通过这样的结构体我们就可以在C语言的的运行时中指向Python的整数对象.

那么相应的我们Python的整数类型对象为

yTypeObject PyInt_Type = {  

PyObject_HEAD_INIT(&PyType_Type)  

0,  

"int",  

sizeof(PyIntObject),  

……  

};

4.自定义对象

当我们创建一个Python对象的时候,最终都是通过Python的底层来做的,

当我们通过Python语言定义了自己的一个class A之后,Python首先根据你写的代码创建了一个A这样的class对象(类对象),然后当你需要创建A的实例的时候,其实在Python的底层都是通过A这个Class对象进行创建的。

二.Python视角中的对象体系

在单纯的Python的世界中,一切都是对象.这些对象可以分为三类,

metaclasses,classes,instance

其中classes又可以分为内置的type和用户自定义的class

下面我们通过一张图片来作详细的说明

Python对象体系深入分析

注:

其中C的定义的方式如下(python 中继承于某类直接写在类名后面的括号中):

class C(object):  

   ......

其中实线表示 is-kind-of 的关系 ,虚线表示is-instance-of的关系.

查看当前classes对象(instances对象没有__bases__属性)的基类的时候,可以用过classes_name.__bases__进行查看,其值为一个Tuple元组(Python支持多继承).

查看当前对象的类型的方法是object_name.__class__

我们可以通过一些测试来证实上面的图:

Python对象体系深入分析

type为所有类的类。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python实现simhash算法实例
Apr 25 Python
python中django框架通过正则搜索页面上email地址的方法
Mar 21 Python
Python使用PIL模块生成随机验证码
Nov 21 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
解决使用PyCharm时无法启动控制台的问题
Jan 19 Python
Python异步操作MySQL示例【使用aiomysql】
May 16 Python
python django model联合主键的例子
Aug 06 Python
python3使用print打印带颜色的字符串代码实例
Aug 22 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
python psutil监控进程实例
Dec 17 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
Mar 24 Python
jupyter notebook的安装与使用详解
May 18 Python
Python中类的继承代码实例
Oct 28 #Python
Python列表list数组array用法实例解析
Oct 28 #Python
python实现无证书加密解密实例
Oct 27 #Python
深入理解Python 代码优化详解
Oct 27 #Python
简单的Python抓taobao图片爬虫
Oct 26 #Python
Python性能优化的20条建议
Oct 25 #Python
跟老齐学Python之网站的结构
Oct 24 #Python
You might like
PHP+jQuery 注册模块开发详解
2014/10/14 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
经典的解除许多网站无法复制文字的绝招
2006/12/31 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
Javascript 错误处理的几种方法
2009/06/13 Javascript
jquery isEmptyObject判断是否为空对象的函数
2011/02/14 Javascript
检测jQuery.js是否已加载的判断代码
2011/05/20 Javascript
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
IE的事件传递-event.cancelBubble示例介绍
2014/01/12 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
基于Jquery代码实现支持PC端手机端幻灯片代码
2015/11/17 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
JS实现仿微信支付弹窗功能
2018/06/25 Javascript
[05:23]DOTA2-DPC中国联赛2月1日Recap集锦
2021/03/11 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
人工智能最火编程语言 Python大战Java!
2017/11/13 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
python正则过滤字母、中文、数字及特殊字符方法详解
2020/02/11 Python
Nginx+Uwsgi+Django 项目部署到服务器的思路详解
2020/05/08 Python
django Layui界面点击弹出对话框并请求逻辑生成分页的动态表格实例
2020/05/12 Python
美国一家著名的儿童鞋制造商:Stride Rite
2017/01/02 全球购物
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
FirstCry阿联酋儿童和婴儿产品网上购物:FirstCry.ae
2021/02/22 全球购物
string = null 和string = ''的区别
2013/04/28 面试题
房地产开盘策划方案
2014/02/10 职场文书
家长会学生演讲稿
2014/04/26 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
关于运动会的广播稿
2014/09/22 职场文书
500字小学生检讨书
2015/02/19 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
Django 实现jwt认证的示例
2021/04/30 Python
浅析Python OpenCV三种滤镜效果
2022/04/11 Python