在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
本文深入探讨Python中object的本质,它是所有Python对象的基础。通过解析object的内部结构,包括引用计数、对象类型等关键特性,揭示Python如何管理和回收对象。同时介绍了不同类型对象如整数和字典的特定行为。

633

被折叠的 条评论
为什么被折叠?



