python底层设计:对象设计思想

目录

1.对象机制的基石PyObject

2.可变对象类型基石:PyVarObject

3.类的设计核心PyTypeObject

3.1.对象的创建原理

3.2 对象行为

3.3 类型的类型

4.对象的多态/动态语言的原理

5.计数引用


在python中,很多模块都是直接由c实现的,所有东西都是对象,即使是int,float等这样的基本数据类型,都是一个对象,比如

>>> import sys
>>> print(sys.getsizeof(int))

416
>>> 

一个int就占用416比特,正是因为python对所有东西都封装成了对象,所以python程序运行需要占用的内存就比c,c++,java等要多得多。

在接下来的说明中,一切都参照python3.7.5源码作讲解。

 

1.对象机制的基石PyObject

 

在python中,所有东西都是对象,所有对象拥有相同的部分内容,而这内容就是PyObject,所以对象的核心是PyObject。

我们先看看PyObject的定义:

typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;
    struct _typeobject *ob_type;
} PyObject;

ob_refcnt其实是一个计数器,与内存管理机制有关,对于对象A,当 新PyObject*引用A对象时,A的计数器+1,当删除这个PyObject*时A的计数器-1,当A计数器为0时,A将从堆中被回收。

ob_type是指明一个对象类型的类型对象,_typeobject结构体是python中内部特殊的对象。

所以在python中,对象机制的核心非常简单:引用计数器+类型信息

PyObject是所有类型对象都必须拥有的,它必须放在对象内存占用最开始的那个字节,除了PyObject,还可以新增额外的信息,构成其他类型的对象,比如float类型的结构设计是:

typedef struct {
    PyObject_HEAD //PyObject_HEAD定义每个PyObject的初始段。
    double ob_fval;
} PyFloatObject;

我们可以看出,float除了PyObject,还有而外的double变量,ob_fval用来存放数值。同理,list,map,set,str等所有对象也是如此:在PyObject之外还定义属于自身的特殊信息。

 

 

2.可变对象类型基石PyVarObject

 

定长对象:拥有固定大小,如int,float等

变长对象:可变元素个数,如str,list等

我们知道,在c 中没有诸如java,python,c++的字符串对象,准确来说,字符串对象维护的是多个char变量,换句话说,python中字符串对象维护的是n个PyObject对象,类似list,dict等对象拥有共同的特征:“n个PyObject”,于是乎就有了PyObject的扩展PyVarObject,它的结构体设计:

typedef struct {
    PyObject ob_base;
    Py_ssize_t ob_size; /* 可变部分的对象数 */
} PyVarObject;

ob_size记录的是变长对象中容纳了几个元素,比如list有5个元素,那么ob_size就等于5.

每个对象头部都有统一的PyObject,这使得对对象的引用变得非常统一,我们只需一个PyObject* 指针就可以指向任意一个对象。

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值