Cpython-Object对象概述

2024-08-25 01:20
文章标签 概述 对象 object cpython

本文主要是介绍Cpython-Object对象概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.Object

>>>a=1
>>>a.__class__
<class 'int'>
>>>int.__class__
<class 'type'>
>>>int.__base
<class 'object'>
>>>#一切继承于Object

在Python中,对象就是为C中的结构体在堆上申请一堆内存,不能被静态初始化,不能在栈空间上生存。但 Python中的类型对象是例外,都是被静态初始化的。

一个对象被创建,在内存中大小是不变的,所以维护容纳一个可变长度数据的对象(如:List类型),就必须在对象内维护一个指向一块可变大小区域的指针。

 1.1PyObject

PyObject是整个Python对象机制的核心。

在Python的世界,一切都是对象,数字、字符串、数据类型、函数等

 /*Inlcude/object.h*/
typedef struct _object{
/*1.release下是NULL,debug下是两个链表指针*/
_PyObject_HEAD_EXTRA/*2.内存管理机制:引用计数,垃圾收集机制对象A的引用计数减至0,A就会从堆上被删除以释放内存long:在linux64下是8字节,其余是4字节
在_PyNewReference(PyObject *op)接口中初始化为1
*/
Py_ssize_t ob_refcnt;/*类型对象:该类型的信息存放在类型对象中*/
struct _typrobject *ob_type;}Pyobject;ob_refcnt:Py_INCREF  /Py_DECREF
内存池--缓冲效果

比如:10作为对象,int就是其类型对象

思考:创建一个对象会发生什么?

1.通过C API创建,称为抽象对象层(AOL):pyobject_**

2.通过类型对象创建,称为混合对象层(COL),内建对象的API,比如PyInt_FromLong

3.直接内存分配(pyA_new())

4.通过设计的类型对象创建实例对象:class A(OBJECT)-->new A()

1.2PyVarObject

// Include/object.h
typedef struct {PyObject ob_base;Py_ssize_t ob_size; /* 可变部分的项数 */} PyVarObject;

1.3定长对象与变长对象

各个对象都拥有相同的对象头部,因此只需要一个PyObject*指针就可以引用任意一个对象

思考:

1.怎么理解整型LongObject是边长对象

2.整型在内存中的字节数是多少?

1.4可变对象与不可变对象

总:不可变数据类型更改后 地址发生改变,可变数据类型更改 地址不发生改变

不可变数据:Number、String、Tuple、None

如果改变Number数据类型的值,将重新分配内存空间,而Number数据类型用于存储数据,类型是不允许改变的。

对象不可变,多任务环境下同时读取对象不需要加锁,同时读也行。

可变数据类型:List、Dictionary、Set

1.5PyLongObject

//Include/cpython/longobject
typedef struct _longobject PyLongObject;struct _longobject {PyObject_HEAD_PyLongValue long_value;
};typedef struct _PyLongValue {uintptr_t lv_tag; /* Number of digits, sign and flags */digit ob_digit[1];
} _PyLongValue;/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD                   PyObject ob_base;/*等价于以下表达*/
typedef struct{
Py_ssize_t ob_refcnt;//引用计数
PyTypeObject *ob_type;//变量类型
uintptr_t lv_tag//位、标志的数
digit ob_digit[1];//默认长度为1
}PyLongObject;

注:V3.12源码中PyLongObject是不可变长对象

思考:

1.如何实现整数相加而内存不溢出

2.不可变对象指什么

3.与可变对象有关联吗

1.6PyTypeObject

python中类型本身也是对象,类型对象。

每个PyObject因为有ob_type存在,才能显示出不同的对象,也就是多态。

比如对象的内存分配大小之类的元信息,隐含于PyObject

思考:类型对象的类型对象是什么:是PyType_Type,tp_name就是type

typedef struct _typeobject PyTypeObject;struct _typeobject {PyObject_VAR_HEADconst char *tp_name; /* 类型名字 */Py_ssize_t tp_basicsize, tp_itemsize; /* 申请内存大小 *//* Methods to implement standard operations */destructor tp_dealloc; //析构函数Py_ssize_t tp_vectorcall_offset;getattrfunc tp_getattr;//获取方法setattrfunc tp_setattr;//设置方法PyAsyncMethods *tp_as_async; /* formerly known as tp_compare (Python 2)or tp_reserved (Python 3) */reprfunc tp_repr;/* Method suites for standard classes *///任意python类型都实现了以下三种方法PyNumberMethods *tp_as_number; //数值对象PySequenceMethods *tp_as_sequence; //序列对象PyMappingMethods *tp_as_mapping; //映射对象/* More standard operations (here for binary compatibility) */hashfunc tp_hash; //哈希方法ternaryfunc tp_call; //调用方法reprfunc tp_str;getattrofunc tp_getattro;setattrofunc tp_setattro;/* Functions to access object as input/output buffer */PyBufferProcs *tp_as_buffer;/* Flags to define presence of optional/expanded features */unsigned long tp_flags;const char *tp_doc; /* 文档字符串 *//* Assigned meaning in release 2.0 *//* call function for all accessible objects */traverseproc tp_traverse;/* delete references to contained objects */inquiry tp_clear;/* Assigned meaning in release 2.1 *//* rich comparisons */richcmpfunc tp_richcompare;/* weak reference enabler */Py_ssize_t tp_weaklistoffset;/* Iterators */getiterfunc tp_iter;iternextfunc tp_iternext;/* Attribute descriptor and subclassing stuff */PyMethodDef *tp_methods;PyMemberDef *tp_members;PyGetSetDef *tp_getset;// Strong reference on a heap type, borrowed reference on a static typePyTypeObject *tp_base;PyObject *tp_dict;descrgetfunc tp_descr_get;descrsetfunc tp_descr_set;Py_ssize_t tp_dictoffset;initproc tp_init;allocfunc tp_alloc;newfunc tp_new;freefunc tp_free; /* Low-level free-memory routine */inquiry tp_is_gc; /* For PyObject_IS_GC */PyObject *tp_bases;PyObject *tp_mro; /* method resolution order */PyObject *tp_cache; /* no longer used */void *tp_subclasses;  /* for static builtin types this is an index */PyObject *tp_weaklist; /* not used for static builtin types */destructor tp_del;/* Type attribute cache version tag. Added in version 2.6 */unsigned int tp_version_tag;destructor tp_finalize;vectorcallfunc tp_vectorcall;/* bitset of which type-watchers care about this type */unsigned char tp_watched;
};//PyVarObject继承PyObject并做了扩展,表示可变对象的元素数量-->可变对象
#define PyObject_VAR_HEAD      PyVarObject ob_base;typedef struct {PyObject ob_base;Py_ssize_t ob_size; /* Number of items in variable part */
} PyVarObject;

存储的信息分为四类:

1.类型名

2.占用内存空间大小

3.与该类型对象相关联的操作信息

4.类型(一个对象)的类型信息,PyType_Type被称为metaclass元类

1.6.1

这篇关于Cpython-Object对象概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104159

相关文章

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

Java对象和JSON字符串之间的转换方法(全网最清晰)

《Java对象和JSON字符串之间的转换方法(全网最清晰)》:本文主要介绍如何在Java中使用Jackson库将对象转换为JSON字符串,并提供了一个简单的工具类示例,该工具类支持基本的转换功能,... 目录前言1. 引入 Jackson 依赖2. 创建 jsON 工具类3. 使用示例转换 Java 对象为

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添