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、代码关系

     

  • 相关阅读:
    SVN:多版本库环境的搭建
    记一次KUBERNETES/DOCKER网络排障
    k8s部署prometheus
    误删除 linux 系统文件了?这个方法教你解决
    kubectl命令自动补全
    git杂记:忽略ssl认证
    微软官方原版本下载msdn
    Android Studio 小技巧(2):AS中Button文字默认大写的问题
    <Android 基础(十一)> Snackbar
    <Android 基础(十)> FloatingActionButton
  • 原文地址:https://www.cnblogs.com/qianyeliange/p/9430508.html
Copyright © 2011-2022 走看看