PyObject and PyTypeObject - Python 中的 '对象' 们
1 PyObject, PyTypeObject - Python 中的 '对象' 们
'一切皆对象' - 这是 Python 的学习和使用者们最最常听到一句, 可谓 博大精深 - '勃大精深'.
'对象(Object)' 是 Python 最核心的一个概念, 在 Python 中 '一切皆是对象'.
整数,字符串,类型type(整数类型, 字符串类型)统统都是'对象'. Python 已经预先定义了一些'类型对象', 如 int 类型, dict 类型, string 类型等等,
这些预先定义的类型对象被称为'内建类型对象'. '类型对象' 实现了面向对象理论中'类'的概念,
通过对类型对象的 '实例化' 创建'实例对象', 如 int 对象, dict 对象, string 对象等.
'实例对象'可以被视为面向对象理论中'对象'这个概念在 python 中的体现.
另外, python 实现了通过 class A(object) 关键字实现自定义类型对象, 通过调用自定义的类型对象实例化类型对象 A().
注: python '类型'(type) -> '类'(class) ; python '实例'(instance) -> '对象'(object) 怎样理解 '对象'(object) 的概念
‘对象’ 这一概念对人的思维是一个比较形象的概念, 然后计算机不能像人的思维一样去'理解'对象这一概念.
计算机并不能理解 是一个整数, 而 '' 是一个字符串, 对于它来说这些都是'字节'(byte).
通常, '对象' 是数据以及基于这些数据的操作的集合. 对于计算机来说, 一个 '对象' 实际上就是一片被分配的内存空间,
这些内存可以是连续的, 也可以是离散的. 这片内存在更高的层面上被作为一个'整体'来考虑和处理, 这个整体就是一个'对象'(对计算机来说)
而在这片内存中存储着一系列的数据以及可以对这些数据进行操作(修改,读取,运行等)的代码(字节码). 如大家所知道的那样, Python 是有 C 实现的, 那么'对象' 在 C 层面是什么样子呢?
PyObject 对象
Python 中, '对象' 就是为 C 中的结构体(structure)在栈堆上申请的一块儿内存区域.
object.h (Python 3.6)
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt; # ob_refcnt 引用计数(垃圾回收机制)
struct _typeobject *ob_type; # ob_type 是一个指向 _typeobject 结构体的指针
} PyObject;
在 C 中定义 PyObject 结构体中 ob_refcnt 与 Python 内存管理机制有关, 它实现了基于 '引用计数' 的 '垃圾回收机制‘.
对于某一特定对象 A, 当有另一个 PyObject '引用' 了该对象的时候, A 的'引用计数'( ob_refcnt ) 增加;
相反地, 如果 当这个 PyObject 被销毁的时候, 对象 A 的'引用计数'( ob_refcnt ) 减少.
当对象 A 的'引用计数'( ob_refcnt ) 减少到 的时候, Python 的垃圾回收机制将把对象 A 从栈堆中删除, 以便释放内存供其他对象使用.
除 '引用计数'( ob_refcnt ) 之外, ob_type 是一个指向 _typeobject 结构体的指针.
这个结构体对应着 Python 内部的一种特殊对象, 用来指定一个'对象' 类型的 '类型对象', 如 对象 的类型对象 是 int 类型对象.
结论, 在 Python 中, 对象机制的核心, 一是 '引用计数'( ob_refcnt ), 另一个是 '类型信息'(ob_type).
通过'类型信息'(ob_type) 进一步对应到 一个对象的'内容','大小' 等信息.
PyTypeObject 类型信息
PyObject 中包括了所有'对象' 共有的信息的定义(ob_refcnt, ob_type).
在结构体 _typeobject 中, 主要定义了 类信息,
, 类型名(tp_name), 主要供 Python 内部, 以及调试使用.
, 创建该类型'对象' 时分配的内存空间相关信息, 即 tp_basicsize, tp_itemsize
, 与该类型'对象'相关联的操作信息, 如 tp_print; tp_getattr; tp_setattr 这些函数指针
, 该类型对象的'类型信息' (通过 PyType_Type 来确定一个对象的 '类型对象') object.h (Python 3.6)
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */ /* Methods to implement standard operations */
destructor tp_dealloc;
printfunc tp_print;
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 */
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; /* Documentation string */ /* 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 */
struct PyMethodDef *tp_methods;
struct PyMemberDef *tp_members;
struct PyGetSetDef *tp_getset;
struct _typeobject *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;
PyObject *tp_subclasses;
PyObject *tp_weaklist;
destructor tp_del; /* Type attribute cache version tag. Added in version 2.6 */
unsigned int tp_version_tag; destructor tp_finalize; #ifdef COUNT_ALLOCS
/* these must be last and never explicitly initialized */
Py_ssize_t tp_allocs;
Py_ssize_t tp_frees;
Py_ssize_t tp_maxalloc;
struct _typeobject *tp_prev;
struct _typeobject *tp_next;
#endif
} PyTypeObject;
PyObject and PyTypeObject - Python 中的 '对象' 们的更多相关文章
- python中拷贝对象的区别
一.赋值.引用 在python中赋值语句总是建立对象的引用值,而不是复制对象.因此,python变量更像是指针,而不是数据存储区域 这点和大多数语音类似吧,比如C++.Java等 1.先看个例子: v ...
- python中生成器对象和return 还有循环的区别
python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因 ...
- python中的对象拷贝
python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引用传递.那python怎样对列表和字典进行拷贝传递呢:标准库的copy模块提供了两个方法:copy和d ...
- Python中Json对象处理的jsonpath-rw
这两天在写一个爬虫,需要从网站返回的json数据提取一些有用的数据. 向url发起请求,返回的是response,在python3中,response.content是二进制bytes类型的,需要用d ...
- Python中的对象行为与特殊方法(二)类型检查与抽象基类
类型检查 创建类的实例时,该实例的类型为类本身: class Foo(object): pass f = Foo() 要测试实例是否属于某个类,可以使用type()内置函数: >>> ...
- 【转】python中的对象拷贝
转自:https://www.cnblogs.com/bhlsheji/p/5352330.html python中.进行函数參数传递或者返回值时,假设是一般的变量,会拷贝传递.假设是列表或字典则是引 ...
- python中判断对象类型的函数——isinstance
isinstance是Python中的一个内建函数.是用来判断一个对象的变量类型. isinstance(object, class-or-type-or-tuple) 如果参数object是clas ...
- [19/10/14-星期一] Python中的对象和类
一.面向对象 ## 什么是对象? - 对象是内存中专门用来存储数据的一块区域. - 对象中可以存放各种数据(比如:数字.布尔值.代码) - 对象由三部分组成: 1.对象的标识(id) 2.对象的类型( ...
- python中json对象转换出错解决方法
今天在使用python中的json转换碰到一个问题: 接收一个post的json字符串: s={"username":"admin","passwor ...
随机推荐
- 【转】分布式服务框架 Zookeeper -- 管理分布式环境中的数据
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...
- 原生javascript 基础动画原理
一.实现原理: 1.开定时器前先清除定时器 2.设置定时器 3.当前元素的位置 + 每一步的长度 4.当元素当前位置超过目标点时,把当前位置==目标点 5.设置元素位置,开始运动 6.判断当前位置如果 ...
- Java BIO NIO 与 AIO
回顾 上一章我们介绍了操作系统层面的 IO 模型. 阻塞 IO 模型. 非阻塞 IO 模型. IO 复用模型. 信号驱动 IO 模型(用的不多,知道个概念就行). 异步 IO 模型. 并且介绍了 IO ...
- 一次asp.net core3.1打造webapi开发框架的实践
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAigAAAAbCAYAAABWfHSvAAAH30lEQVR4nO1dy5GsMAx80RIESRAEST ...
- JAVA大数贪心
题意:01给出一个数n,现在要将它分为m个数,这m个数相加起来必须等于n,并且要使得这m个数的或值最小. 思路分析: 一个简单的贪心,从高位到低位,判断当前位可否为 1 ,若可以,则将所有的数的这一位 ...
- NPOI导出Excel生成多个sheet
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 【java面试】Web篇
1.AJAX创建步骤 step1. 创建XMLHttpRequest对象,也就是创建一个异步调用对象: step2. 创建一个新的HTTP请求,并指定改HTTP请求的方法.URL以及验证信息: s ...
- 我的C++开发工具链
工欲善其事,必先利其器.想要干好活,顺手的工具是必不可少的.来分享下我的C++开发工具链. 平台:Windows 编译器:MSVC IDE:Visual Studio 版本控制:TortoiseGit ...
- mysql5.7的基本使用
mysql的基本使用:最简单的增删改查 (建议用类似记事本的东西写代码,错了容易改) 以下就是这篇文章的代码 一,增和查 CREATE DATABASE one; 新建了一个名为one的数据库 S ...
- 工具之sed
转自:http://www.cnblogs.com/dong008259/archive/2011/12/07/2279897.html sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行 ...