python 源码解析 object 定义的介绍
在python的世界中一切皆对象,所有的子类都是继承自同一个父类,object
那object 到底是什么呢?
来看源码定义
typedef struct _object {_PyObject_HEAD_EXTRAPy_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源码解析:内存管理(DEBUG模式)的几个理解点
写了这多贴子,顺带写点自己的感想吧!其实很多贴子在写的时候很踌躇,比如这次打算写的python内存管理,因为内存管理都比较琐碎,在软件架构里,也是很容易出问题的地方,涉及的细节内容非常多,要写好写明白 ...
- JDK源码解析——Object的hashCode方法
目录 前言 说明 一.源码目录结构 (1).JDK目录 (2).hotspot目录 二.基础知识 (1).Object Header(对象头) (2).Lock(锁) 1. 无锁 => 偏向锁 ...
- Python源码解析-整数与引用计数器
文章目录 简介 PyLongObject 大小整数 大小整数的区分 小整数池初始化 整数对象的创建 计数回收机制 本文基于Python3.10.4. 简介 在Python源码中,整数这个概念是通过Py ...
- JDK源码解析--Object类
作为一名java开发,肯定会知道object类,object类是所有类的基类,当一个类没有直接继承任何类时,默认继承object类,所以也被称之为"上帝类". 目录 一.继承Obj ...
- spring源码解析bean定义五ContextNamespaceHandler一
2019独角兽企业重金招聘Python工程师标准>>> 前言 本文转自"天河聊技术"微信公众号 本次介绍ContextNamespaceHandler的prope ...
- Vue2源码解析 Object变化监听
目录 1 什么是变化监听 2 如何跟踪变化 3 何如收集依赖 4 依赖收集在哪 5 依赖是谁 6 什么是Watcher 7 递归侦测所有key 8 关于Object的问题 9 总结 1 ...
- BasicGames Python 源码解析 02 Amazing
:apachecn/python-code-anal 这个游戏会接收用户输入的长和宽,动态生成一个迷宫. 改进自 Frank Palazzolo 的版本. 导入 import random impor ...
- BasicGames Python 源码解析 01 AceyDucey
:apachecn/python-code-anal 导入 import random cards # 定义卡牌面值和名称的映射 cards = {1: "1",2: " ...
- python 源码解析
http://blog.donews.com/lemur/archive/category/cpython%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/ 转载于:https ...
最新文章
- Python 开发者节省时间的 10 个小技巧
- tmux的使用方法和个性化配置
- 两个onCreate方法?你真的了解onCreate()么?
- 2021-03-12 Python基础核心概念 变量和简单数据类型
- Java多线程-线程状态
- java set的first_Java TreeSet pollFirst()方法与示例
- 【吼吼睡cocos2d学习笔记】第四章 - 第一个游戏
- poj 1251 Jungle Roads
- Windows Server 2016 RTM AVMA Keys
- android excel加图片,安卓和iOS版的Excel现在可以拍摄图片上的表格转为电子表格
- MySQL数据库中存储引擎和数据类型
- html项目符号正方形,html 项目符号
- Unity篇——Minimap小地图
- Spring cloud config 配置文件加密
- Word如何让不同页显示不同的页码,页眉
- Elasticsearch 7.X data stream 深入详解
- 建议收藏!这10个学习编程的小技巧,万人点赞!
- 安全狗发布网站后门查杀引擎“啸天”变形网马无处可匿
- 《资本论》读书笔记(2)第二卷第一章:资本形态变化及其循环
- linux+gunzip解压命令,Linux中的Gunzip命令详解