zoukankan      html  css  js  c++  java
  • Python 源码剖析(一)【python对象】

    处于研究python内存释放问题,在阅读部分python源码,顺便记录下所得。
    (基于《python源码剖析》(v2.4.1)与 python源码(v2.7.6))

    先列下总结:
            python 中一切皆为对象,所以会先讲明白python中的对象,然后开始整理最简单的两个类型,整形和字符串;然后会进一步探索容器类型,会讲 List 和 Dict,以及内存管理机制。有时间精力会总结下《python源码剖析》作者的 python模拟程序、编译的code对象与pyc文件、python虚拟机相关知识,运行环境,模块动态加载、多线程机制。

    直入主题,开始总结。


    一、Python对象

    1、对象

    2、对象类型

    3、继承与多态

    4、引用计数

    5、对象分类


    1、对象

    python中一切皆为对象,包括自定义类型,int、str、list、dict等都是对象,先看看所有对象的基石:

    *定长对象(int,str):

    [object.h]

    typedef struct_object{

    PyObject_HEAD

    }PyObject;

    *变长对象(list,dict..):

    [object.h]

    typedef struct{

    PyObject_VAR_HEAD

    }PyVarObject;

    //前者依赖于PyObject_HEAD,后者依赖于PyObject_VAR_HEAD,看看两者不同:


    图1-1-1

    由图1-1-1可见,定长对象中有

    ob_refcntob_type这两个变量,变长对象中多了一个ob_size变量;其中,ob_refcnt用于引用计数机制,ob_type是一个指向_typeobject结构体的指针,ob_size指变长对象中包含的元素个数。

    ob_refcnt后面内存回收时再讲,大概就是某个对象A,对其有引用时引用计数增加,释放时引用计数减少,引用计数为0时将回收对象A,从堆上删除释放内存。

    ob_type_typeobject结构体,用于指定一个对象类型的类型对象。有点拗口,下节讲。

    ob_size用于指明容器对象中拥有元素的个数,不是字节数。


    2、对象类型

    现在分析上节提到的_typeobject,类型对象


     

    图1-2-1

    _typeobject是比较大的一个结构体,主要有四类信息:

    1、类型名tp_name,用于pyhton内部及调试;

    2、创建该类型对象时分配内存空间大小信息,tp_basicsizetp_itemsize

    3、与该对象有关的操作信息,如hashfunc(函数指针),操作主要分为标准操作、标准操作族、其他操作;

    4、类型信息;

    _typeobject头部中有PyObject_VAR_HEAD,说明类型也是一个对象,而类型对象的类型则是PyType_Type(图1-2-2):


    图1-2-2

    例如整形int(图1-2-3):


    图1-2-3

    其运行时对象类型关系(图1-2-4):


    图1-2-4

    3、继承与多态

    通过前面的PyObject和类型对象,Python利用C语言实现继承和多态。首先,Python中所有内建对象和内部使用对象在最开始内存区域都有一个PyObject,相当于这些对象都继承于PyObject;在建立一个对象时,如PyIntObject,这对象由PyObject*维护而非PyIntObject*维护,而这指针指向的类型只能从ob_type域判断,从而实现多态。


    4、引用计数

    Python内建了垃圾收集机制,使用每个对象共有的ob_refcnt来维护引用计数,通过PyINCREF(op)和Py_DECREF(op)两个宏来增减对象引用计数,当引用计数为0后通过tp_dealloc释放其内存和系统资源。在对象初始化时,通过_Py_NewReference(op)将对象引用计数初始化为1。(代码如图1-4-1)


    图1-4-1

    还有要注意的是,但引用计数减为0时,会调用该对象的析构函数,但不一定会调用free,频繁申请、释放内存降会低执行效率,Python使用内存池计数作为补充。


    5、对象分类

    1、Math:数值对象

    2、Container:容器对象

    3、Composition:程序结构对象

    4、Internal:内部使用对象

    图示(图1-5-1):


    图1-5-1
     
  • 相关阅读:
    RocketMQ logback使用实践
    用SLF4j/Logback打印日志-3
    UI调试工具 SAK 布局 [MD]
    Gradle 翻译 Merge AndroidManifest 合并清单文件 [MD]
    Gradle 翻译 build dependencies 依赖 [MD]
    Gradle 翻译 tips and recipes 使用技巧 [MD]
    依赖注入 DI 控制反转 IOC 概念 案例 [MD]
    属性动画 基本使用案例 [MD]
    架构 MVC MVP MVVM 简介 [MD]
    MMKV 多进程K-V组件 SP [MD]
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/6500577.html
Copyright © 2011-2022 走看看