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

相关文章

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

深入探讨Java 中的 Object 类详解(一切类的根基)

《深入探讨Java中的Object类详解(一切类的根基)》本文详细介绍了Java中的Object类,作为所有类的根类,其重要性不言而喻,文章涵盖了Object类的主要方法,如toString()... 目录1. Object 类的基本概念1.1 Object 类的定义2. Object 类的主要方法3. O

vue如何监听对象或者数组某个属性的变化详解

《vue如何监听对象或者数组某个属性的变化详解》这篇文章主要给大家介绍了关于vue如何监听对象或者数组某个属性的变化,在Vue.js中可以通过watch监听属性变化并动态修改其他属性的值,watch通... 目录前言用watch监听深度监听使用计算属性watch和计算属性的区别在vue 3中使用watchE

Java将时间戳转换为Date对象的方法小结

《Java将时间戳转换为Date对象的方法小结》在Java编程中,处理日期和时间是一个常见需求,特别是在处理网络通信或者数据库操作时,本文主要为大家整理了Java中将时间戳转换为Date对象的方法... 目录1. 理解时间戳2. Date 类的构造函数3. 转换示例4. 处理可能的异常5. 考虑时区问题6.

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

Java第二阶段---09类和对象---第三节 构造方法

第三节 构造方法 1.概念 构造方法是一种特殊的方法,主要用于创建对象以及完成对象的属性初始化操作。构造方法不能被对象调用。 2.语法 //[]中内容可有可无 访问修饰符 类名([参数列表]){ } 3.示例 public class Car {     //车特征(属性)     public String name;//车名   可以直接拿来用 说明它有初始值     pu

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

【Python报错已解决】AttributeError: ‘list‘ object has no attribute ‘text‘

🎬 鸽芷咕:个人主页  🔥 个人专栏: 《C++干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一:检查属性名2.2 步骤二:访问列表元素的属性 三、其他解决方法四、总结 前言 在Python编程中,属性错误(At