Python对象初探

在Python中,一切都是对象。连类型也是一种对象。
在Python中,对象就是为C中的结构体在堆上申请的一块内存。一般来说,对象是不能被静态初始化的,并且也不能在栈空间上生存。
唯一的例外就是类型对象,Python中所有的内建的类型对象(如整数类型对象,字符串类型对象)都是被静态初始化的。

在Python中,一个对象一旦被创建,它在内存中的大小就是不变的了。这就意味着那些需要容纳可变长度数据的对象只能在对象内维护一个指向一块可变大小的内存区域的指针

PyObject是整个Python对象机制的核心。

typedef struct _object{PyObject_HEAD}PyObject;

注意PyObject_HEAD,Python对象的秘密都隐藏在这里。

#define PyObject_HEAD_PyObject_HEAD_EXTRA int ob_refcnt;struct _typeobject *ob_type;

在PyObject的定义中,ob_refcnt与Python的内存管理机制有关,它实现了基于引用计数的垃圾收集机制。
ob_type是一个指向_typeobject结构体的指针,这个结构体对应着Python内部的一种特殊对象,它是用来指定一个对象类型的类型对象。
在Python中,对象机制的核心其实非常简单,一个是引用计数,一个就是类型信息。

例如一个Python的整数对象

typedef struct {PyObject_HEAD //Python对象都具有的long ob_ival; //整数对象特有的信息} PyIntObject;

Python在PyObject对象之外,还有一个表示这类对象的结构体——PyVarObject

#define PyObject_VAR_HEAD \PyObject_HEADint ob_size;

typedef struct {PyObject_VAR_HEAD} PyVarObject;

整数对象不包含可变长度数据的对象称为"定长对象",而字符串对象这样包含可变长度数据的对象称为"变长对象"。

在Python内部,每一个对象都拥有相同的对象头。在Python中,对对象的引用非常的统一,我们只需要用一个PyObject*指针就可以引用任意的一个对象。

Python内部如何从无到有地创建出一个整数对象,Python会有两种方法。第一种是通过Python C API来创建,第二种是通过类型对象PyInt_Type.

Python的C API分成两类:
一类称为范型的API,或者称为AOL(Abstract Object Layer)。这类API都具有诸如PyObject_***的形式,可以应用在任何Python对象身上,比如输出对象的PyObject_Print
另一类是与类型相关的API,或者称为COL(Concrete Object Layer)。这类API通常只能作用在某一种类型的对象上,对于每一种内建对象,Python都提供了这样的一组API。

在Python2.2之后,int是一个继承自object的类型,类似于int对应着Python内部的PyInt_Type,object在Python内部则对应着PyBaseObject_Type

转载于:https://www.cnblogs.com/moonflow/archive/2012/01/18/2325172.html

Python源码剖析学习二相关推荐

  1. STL源码剖析学习二:空间配置器(allocator)

    STL源码剖析学习二:空间配置器(allocator) 标准接口: vlaue_type pointer const_pointer reference const_reference size_ty ...

  2. Python 源码剖析(二)—— 第一次修改 Python 源代码

    对于输出信息,使用 printf 最为简单.但是 printf 要输出 Python 中的某个对象却不是那么方便,幸好 Python 的 C API 提供了一个输出对象的接口: object.h(在 ...

  3. Python猫荐书系统之四:《Python源码剖析》

    大家好,新一期的荐书栏目如期跟大家见面了. 先来看看今天的主角是谁:<Python源码剖析--深度探索动态语言核心技术>,2008年出版,作者 @陈儒 ,评分8.7分. 是的,你没看错,出 ...

  4. Python发展的新时代—冯大辉先生谈《Python源码剖析》

    Python 3.0 beta 1终于在 6 月 18 号发布了,依照Python一贯主张的简洁,标准,统一精神,Beta版的新特性让我们惊喜的发现,Python正如我们所期望的那样已经进入了一个蓬勃 ...

  5. 《Python源码剖析》读书笔记

    <Python源码剖析>电子书下载 http://download.csdn.net/detail/xiarendeniao/5130403 Python源码在官网有下载链接,用ctags ...

  6. Python源码剖析2-字符串对象PyStringObject

    二. 1.PyStringObject与 PyString_Type PyStringObject是变长对象中的不可变对象.当创建了一个PyStringObject对象之后,该对象内部维护的字符串就不 ...

  7. Python源码剖析:前言

    第0章:前言 0.0 我的前言  在几个月学习的中,已经学习了python基本.进阶的语法,如果有读者不清楚的话,可以参考我之前的专栏<python进阶>.  而在这个专栏<pyth ...

  8. 《Python源码剖析》上架

    经过几年的打磨,在博文视点的大力支持下,<Python源码剖析>终于上架了.当年开始剖析Python源码的时候,对于出版,心里只有一个朦朦胧胧的梦想,甚至可以说是幻想,现在幻想成真,回想一 ...

  9. Apollo源码剖析学习笔记2

    Apollo 源码剖析学习笔记2 Talker-ListenerNode 目录中包含了 Node 对象.Reader 对象和 Writer 对象.Node 对象主要对应 Ros 中的 Node 节点, ...

最新文章

  1. 自由主义者的周一和周五
  2. Living life over 假如生活重头再来
  3. 动态规划—最小路径和
  4. C语言 关键字 | typedef
  5. ROS学习(15)RoboWare Studio的安装使用
  6. BASH脚本基础:语法检查与调试
  7. openjudge 1.5.21 角谷猜想
  8. Nacos 2.0.0版本正式发布
  9. 第三代电力电子半导体:SiC MOSFET学习笔记(五)驱动电源调研
  10. [智慧农业]Python基于改进YOLOv5的猕猴桃叶病害检测系统(完整源码&数据集&视频教程)
  11. Spring父子类同属性父类属性隐藏
  12. 一篇小论文:VGGish-BiGRU网络
  13. 【AtCoder】AtCoder Grand Contest 041
  14. mysql call_mysql call用法:调用存储过程
  15. 【Redis】(二)Redis命令大全(速记)
  16. 大数据分析就业培训课程大纲分享
  17. UEFI应用与编程--SMM(一)
  18. 【三维几何学习】DiffusionNet: Discretization Agnostic Learning on Surfaces
  19. 制造业的发展战略规划
  20. Python爬虫总结——常见的报错、问题及解决方案

热门文章

  1. Docker容器的原理与实践(上)
  2. 部署RDS服务器实现密码修改功能
  3. C# WinForm给Button按钮或其它控件添加快捷键响应
  4. android 虚拟机快捷键中英列表
  5. 使用Office组件读取Excel,引用Microsoft.Office.Interop.Excel出现的问题
  6. LAMP部署搭建————重要文件备份
  7. hostname命令详解
  8. 程序员请不要问“在吗?”
  9. 那些年,SDN走过来时的路
  10. Debian 8 直接升级到 Debian 9