python 源码解析 object 定义的介绍

在python的世界中一切皆对象,所有的子类都是继承自同一个父类,object
那object 到底是什么呢?

来看源码定义

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

这个object 其实就是一个结构体,Py_ssize_t ob_refcnt; 记录了 某个对象被引用的次数 python 通过 #define Py_INCREF(op) 宏来增加引用计数, 通过#define Py_DECREF(op) 宏来减少引用计数, 对象初始化时使用 #define _Py_NewReference(op) 宏来初始化引用计数为 1。当该计数等于 0 时 就会被垃圾回收器回收
struct _typeobject *ob_type; 记录了该对象的类型
_PyObject_HEAD_EXTRA 官方的注释是 /* Define pointers to support a doubly-linked list of all live heap objects. */ 为所有在堆上存活的对象定义的支持双向链接的指针

因此这个object 构成了所有python对象的基石, 所有的对象都会有 引用计数 和 对象类型
这两个特征, 但是其他对象由于各自不同,因此还会有自己的属性。

struct _typeobject 这个结构体还定义了
const char *tp_name;该类型的名称
Py_ssize_t tp_basicsize, tp_itemsize; 创建类型时分配的内存大小
等诸多关于类型创建对象所用到的函数指针,在对象创建初始化时,根据对象类型的不同可以指定不同的对象支持的不同操作,这正是一个对象区别于另外一个对象的原因

例如,如果创建的对象是 int 对象
那么它就需要用到该函数指针 PyNumberMethods *tp_as_number; 定义该int 对象支持的操作方法
如果该对象是字典类型
那么初始化时就需要用到该函数指针PyMappingMethods as_mapping; 定义了字典对象应该支持的方法

object 源码地址: https://github.com/python/cpython/blob/master/Include/object.h,
https://github.com/python/cpython/blob/master/Objects/object.c

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值