zoukankan      html  css  js  c++  java
  • Python源码阅读:对象

    py一切皆对象的实现

    Python中对象分为两类: 定长(int等), 非定长(list/dict等)

    所有对象都有一些相同的东西, 源码中定义为PyObjectPyVarObject, 两个定义都有一个共同的头部定义PyObject_HEAD(其实PyVarObject有自己的头部定义PyObject_VAR_HEAD, 但其实际上用的也是PyObject_HEAD).

    源码位置: Include/object.h

    1、PyObject_HEAD

    在Python内部, 每个对象拥有相同的头部.其C语言定义为:

    1 /* PyObject_HEAD defines the initial segment of every PyObject. */
    2 #define PyObject_HEAD                   
    3     _PyObject_HEAD_EXTRA                
    4     Py_ssize_t ob_refcnt;               
    5     struct _typeobject *ob_type;

    说明:

    1. _PyObject_HEAD_EXTRA
    先忽略, 双向链表结构, 后面垃圾回收再说
     
    2. Py_ssize_t ob_refcnt
    Py_ssize_t在编译时确定, 整型
    ob_refcnt, 引用计数, 跟Python的内存管理机制相关(基于引用计数的垃圾回收)
     
    3. struct _typeobject *ob_type
    *ob_type 指向类型对象的指针(指向_typeobject结构体)
    决定了这个对象的类型!

    2、PyObject

    其定义为:

    1  typedef struct _object {
    2      PyObject_HEAD
    3  } PyObject;

    其依赖关系为:PyObject -> PyObject_HEAD,即如下结构:

    3、PyVarObject

     其定义为:

    1 typedef struct {
    2     PyObject_VAR_HEAD
    3 } PyVarObject;
    4  
    5 #define PyObject_VAR_HEAD               
    6   PyObject_HEAD                       
    7   Py_ssize_t ob_size; /* Number of items in variable part */

    依赖关系为: 

     1. 依赖关系
     PyVarObject -> PyObject_VAR_HEAD -> PyObject_HEAD
     
     2.Py_ssize_t ob_size
     ob_size, 变长对象容纳的元素个数

    即如下结构:

    4、代码关系

     

  • 相关阅读:
    安卓开发1-开发第一个安卓hello word
    安卓开发系列
    Php调用工行支付接口时的问题解决
    angular模块
    angular自定义指令基础
    ajax跨域问题
    angular要点总结
    JS闭包函数
    避开ie6使用float后再使用margin兼容的2种方法
    如何学习面向对象编程
  • 原文地址:https://www.cnblogs.com/qianyeliange/p/9430508.html
Copyright © 2011-2022 走看看