python里object是什么类型_Python构件:PyObject

原标题:Python构件:PyObject

147091807428184751.GIF

Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发。

各位读者,你们好!

深入使用Python语言之前,我们有必要熟悉其中的主要概念。十分简单,每个元素都是一个对象。这是我们学习Python内部原理的第一步,以便我们继续深入学习。

本文主要探讨的是如何在低版本Python系统中操作它的对象。接下来要讨论的CPython操作基于Python 2.7.8。

在这里,我假定你们已经下载好了Python源码并已将其解压,如此,相关的源代码将能在系统跟文件夹下找到。

PyObject & PyVarObject

Python中的所有元素都是对象。从字面意思理解,你在Python中操作的任何元素都是一个由C语言实现的PyObject对象。

函数

切片

文件

迭代器

描述符

sequence对象

数值类型

值得一提的是,当你使用C语言结构原型时,Python对象在内部由PyObject和PyVarObject表示,其中PyVarObject是一种泛型对象。后者适用于各种可变尺寸的容器对象(动态的),而前者适用于其他对象(静态的)。

只要每个内建或是由用户指定的类型被封装成一个对象,就可以利用辅助信息进行移植。Python也不例外,每个Python对象都有一个指向类型对象的指针和一个引用计数器。虽然方便,但也需要付出相应的代价。直接的后果是导致性能下降。不过好在Python使用的一些技术和算法为了提高处理速度允许进行相应的改良,如字符串驻留算法和自适应数乘算法等。

下面的内容引用自Python2.7.10官方文档:

PyObject

所有对象均衍生自这种基类型,这种类型包含如何将指向对象的指针亦作为对象处理的信息,这正是所Python需要的。在正常的“release”编译方式下,它仅包含对象的引用计数值以及相应指向类型对象的指针。这和由宏指令PyObject_HEAD定义的类相一致。

PyVarObject

它由PyObject扩展而来,另外增加了ob_size类,仅用于那些有长度概念的对象。这种类型在Python/C应用中不太常见。它和由宏指令PyObject_HEAD定义的类也是一致的。

不要担心不会宏指令或者不知道变量名,我们将会实现它们。

PyObject和PyVarObject结构究竟是什么呢?这里从源码中摘录了一个片段:

..includeobject.h

147091807439214020.PNG

上述代码并不完全,我们继续探究(为了代码的清晰易懂,相较原文有所删减):

..includeobject.h

147091807766476944.JPEG

有些宏用于定义类,其他的用于初始化。

不知道你有注意到 _PyObject_HEAD_EXTRA 和 _PyObect_EXTRA_INIT 宏并没有定义了吗?事实上,全部的Python版本都是默认这样处理的。定义它们的唯一方式是使用Python编译器“Debug”一下。当然,这将会在以后进行介绍。作为教育目的,它们将以未定义的方式给出。

全部的宏都展开后,PyObject将是这个样子:

147091807850507239.PNG

不必担心Py_ssize类型,把它想成int型就行。其他类的含义可以从词义看出来:ob_recnt为引用计数器,ob_type则是指向PyTypeObject的指针。这点稍后再谈。

现在看看PyVarObject源码吧:

147091807889001122.PNG

可以看出来,大部分内容和PyObject是相同的,除了一个例外:ob_size,它表示可变尺寸容器所包含项目的数量(俏皮话)。

面向对象的C程序设计

至此,我想你应该明白为什么PyObject和PyVarObject(以及我们稍后将会学到的其他对象)表现出类似的特性了吧(ob_refcnt和ob_type)?

这些特性使得我们能够从底层类型抽象出共同的概念,并使我们能够以类似的方式使用各种类型,不管是简单的整形或字符串型,还是类实例,抑或切片对象。

每个Python的类型(PyIntObject,PyFloatObject以及PyDictObject)运行时都会将PyObject_HEAD作为第一个参数(或者第一个参数列表中的第一个参数,以此类推)。子对象成员的位置会被确保和全对象的位置一致。

PyObject_HEAD通常在子对象成员中出现,但只要ob_type被用于获取全部类型信息,它就能够变身为全部类型了。这种技术为C语言增色不少,尤其在轻量继承方面。

PyIntObject & PyDictObject

让我们看看实体对象PyIntObject和PyDictObject在Python中是如何运行的。

..includeintobject.h

147091807988740758.PNG

..includeintobject.h

147091808002338626.PNG

又看到PyObject_HEAD了吧?这意味着我们可以将PyIntObject看成PyObject附加了一些数据(上例中为long类型)。

同理可以查看PyDictObject对象(Python中的符号“{}”代表字典):

147091808050897826.PNG

虽然字典类型稍微复杂一点,但我们仍可将它看做PyObject对象,就像将PyIntObject看成PyObject一样。仅仅的不同是PyDictObject增加了更多的数据。最为重要的是,这些对象被严格地定义在PyObject_HEAD之后。

学习了PyObject_HEAD的内部原理后,我们还得知道Python中的Py*Object对象,下面的代码段中的注释足以帮助你理解它的运行原理。它向你展示了Python如何界定当前所处理的类型:

147091808101860849.PNG

为了增加代码的可读性,Python定义了大量的宏。例如,你可以使用PyInt_Check或者PyInt_CheckExact代替ob_type。类似的宏定义在每个Python对象的C文件开头找到。

字典对象“{}”:PyDict_Check和PyDict_CheckExact

函数对象:PyFunction_Check

元组对象“()”:PyTuple_Check和PyTuple_CheckExact

到现在,上面的代码就可以重写为这样了:

147091808123912209.PNG

一些Python对象同时拥有自己的专有类型检查功能和普通类型检查功能。它们的定义在..IncludeObject.h文件中,例如:

147091808148767326.PNG

PyTypeObject

到现在,关于PyObject未曾提及的就剩类型了。Python中的类型不仅仅是个名称(如“int”和“tuple”)和相应存储的值,还包括大量东西(例如函数,数据成员),它们若被联系到一起,将会产生一系列特性。

回忆一下PyObject_HEAD代码段:

147091808172666519.PNG

其中的ob_type涉及到了对象类实例。让我们剖析一下(这也是我很感兴趣的地方):

..includedictobject.h

147091808228766332.JPEG

这并不是整体架构,但是最有意思的一部分。你或许会想,看起来怪怪的作用符func仅仅是个回调体。每个Python对象都应以一种方式初始化它。

例如,cmpfunc tp_compare;明显表示它与对象之间的比较有些联系。PyIntObject对于比较函数和PyTupleObject的处理将会有所不同。

另外,hashfunc tp_hash;将哈希函数定义为一种类型。例如,string将包含这一功能,但dictionary就没有。猜猜是为什么?

如果你想阅读更多相关知识,可以参阅 Python/C API Reference Manual, "Object Implementation Support", "Type Objects"一节。

接下来将对如下图所示函数在PyInt_Type,PyDict_Type和PyTuple_Type对象中的运行进行比较:

147091808239866464.PNG

由于前三个函数拥有返回值,这提示我们,它们应用在Python抽象对象层。

抽象对象层定义了若干Python对象在运行和分类是应遵守的协议。协议指的是一类用于规定函数功能及其行为的集合。比方说一种函数当且仅当其被用作一组特殊功能(长度,尺寸,连接函数等)时被归为基于序列的类型。

现存在许多协议,我们主要看以下这些:

数字协议:全部数值类型(包括整形、浮点型、复数类型等)

序列化协议:序列化类型(包括字符串、列表、元组等)

映射协议:映射类型(字典)

回到我们的例子。

PyInt_Type

147091808283262173.PNG

PyInt_Type执行数字协议,这也就是tp_as_sequence和tp_as_mapping函数为空的原因了。

所有的静态类型拥有专有的哈希函数,PyInt_Type也是如此(int_hash)。

PyDict_Type

147091808302898104.PNG

Python中的字典比较微妙,虽然它是映射协议的唯一代表,但也会表现出一些序列化协议的性质(实际上函数__contains__就是一类字典键值的排序)。

由于字典类型可变,因此它没有哈希函数(仅PyObject_HashNotImplemented除外)。

PyInt_Type

147091808348323951.PNG

元组类型也相当微妙,虽然元组基于序列化类型,但它常常遵守两种协议:序列化协议和映射协议。这也是函数tp_as_sequence和tp_as_mapping函数非空的原因了。

元组为静态对象,因此拥有哈希函数(tuplehash)。

就此,我希望你充分体会到了CPython的乐趣。虽然只是一个概述(不太深入),但对于深入了解Python内部机制还是很有帮助的。

参考

Python Standard Library

Python/C API Reference Manual

英文原文:http://www.gahcep.com/python-internals-pyobject/

译者:python_baby返回搜狐,查看更多

责任编辑:

weixin_39684995
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深入源码解析Python中的对象与类型
01-20
所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObject, 两个定义都有一个共同的头部定义PyObject_HEAD(其实PyVarObject有自己的头部定义PyObject_VAR_HEAD, 但其实际上用的也是PyObject_HEAD). ...
cpython中的PyObject等对象入门
phoenix_wangxd的博客
11-03 582
python中一切皆对象,所以有关对象的定义是比较重要的,本文我们从cpython的源码中介绍cpython中基本的对象结构。
pythonobject是什么类型_Python中的object这个叫做基类的类,它的属性和行为都有哪些?...
weixin_39677870的博客
11-25 4753
声明:以下仅为个人学习Python过程中总结的比较自洽的理解,事实上Python面向对象模型可能没那么简单。经查阅,Python在以前的版本还有不继承自object的类,叫做经典类。用dir(object)可以查看object所有属性和方法的名称。个人的理解是,objectPython语言面向对象模型的重要且必要组成部分。在Python中,每一个名称(变量名、函数名、类名)都指向一个对象(对象往...
Python源码剖析》之对象的基石---PyObject
最新发布
max_LLL的博客
04-20 740
ob_refcnt和ob_type,其中_PyObject_HEAD_EXTRA是用于指向活动堆的指针,这个我们暂时不用管;ob_refcnt是用于引用计数的,它的类型是long,记录了当前对象被引用的次数;ob_type是对PyTypeObject类型的一个引用,它也是今天的一个主角,我稍后会在下面重点介绍它的,通过了解它,我相信你会发出类似于“哇!~”的感叹,或者是突然灵光一现的样子:原来是这样子🦆~(如果你也是一个python爱好者的话哈哈哈)
PyObject和PyTypeObject
Jakob_Hu的博客
06-14 1222
PyObject和PyTypeObject一. 实例对象的基石—PyObject和PyVarObject1.1 PyObject结构体1.2 宏的定义1.3 PyVarObject结构体1.4 两种头部信息宏定义及其初始化1.4.1 定长对象实现1.4.2 变长对象实现1.4.3 头部信息宏初始化二. 类型对象的基石—PyTypeObject2.1 PyTypeObject包含信息2.2 类型对象和实例对象在内存中的关系 Python是C语言实现的,因此Python对象在C语言层面应该是一个结构体 ,组织对
类与对象——PyObject
幻世
02-28 6444
对象和类型对象——Object & type object Object是分配在堆(heap)上的结构,使用引用计数方法进行垃圾回收(Type Object例外)。 Object永远不会被静态分配或者分配在栈上,必须只能通过特殊宏或函数来访问。 对象都拥有一个reference count属性,用来记录指向该对象的指针数量,当引用计数归零时,该对象将被从堆上移除。 对象都拥有一个type...
举例讲解Python中is和id的用法
12-25
Python源代码为证。   static PyObject * cmp_outcome(int op, register PyObject *v, register PyObject *w) { int res = 0; switch (op) { case PyCmp_IS: res = (v == w); break; case PyCmp_IS_NOT: ...
dm.rar_DM游戏_PyObject_dm代码软件
09-22
很不错了以个款游戏的服务器代码有兴趣自己看
cpython-lldb:LLDB扩展,用于调试Python程序
05-28
在分析Python进程的状态时,通常您只能访问解释器级别的信息:每个变量的类型均为PyObject *,并且堆栈跟踪将仅包含CPython内部调用和对外部库的调用。 除非您是CPython开发人员,否则需要对解释器实现中的某些错误...
pyo3:pyobject.ru的来源
05-24
pyo3 v3的来源。
讲解PyObject_CallMethod
牛肉胡辣汤
01-04 1038
cCopy code函数是Python的C语言扩展中一个非常重要的函数,可用于通过对象的方法名调用对象的方法。它为Python的C语言扩展提供了方便和灵活的接口,帮助我们在C语言层面与Python对象进行交互和操作。这样的技术博客推荐包括示例代码和相关说明,方便读者理解函数的使用和目的。博客结构清晰,标题准确描述了主题,内容包含了参数、返回值、使用示例等方面的讲解。同时使用Markdown代码格式,使得博客内容更加具有可读性和易于编写。
Python中的type和object详解
m0_72557783的博客
12-07 2093
这篇博客主要描述Python的新风格对象(new-style objects)
PyObject_CallMethod函数】
u013454780的博客
04-08 1603
PyObject_CallMethod函数
Python - Object
热门推荐
txnuli的博客
12-08 2万+
Object类 所有类的父类,默认所有的类都继承至Object类 规定了类的结构,加载方式,常用函数 以前的写法: class 类名(Object): pass 现在的写法: class 类名: pass 如果有父类才编写,如果没有父类可以省掉Object类,但是也是默认继承 内置函数: __new__(cls, *args, **kwargs) 创建对象时自动调用的函数,主要作用是创建对象,给该对象分配空间,方便之后的的操作 该函数会返回创建...
pythonobject是什么_python object是什么类型
weixin_39640543的博客
12-06 5669
Python的世界中,object是父子关系的顶端,所有的数据类型的父类都是它;type是类型实例关系的顶端,所有对象都是它的实例的。它们两个的关系可以这样描述:object是一个type,object is and instance of type。即Object是type的一个实例。>>>object.__class__>>>object.__base...
pythonobject
氮气蜗牛的博客
05-20 5932
object类 如python之继承及其实现方法这一节提到过的,object类是所有类的父类,因此所有类都有object类的属性和方法。 如python之封装及私有方法使用过的,内置函数dir()可以查看指定对象所有属性 object有一个_str_()方法,用于返回一个对于“对象的描述”,对应于内置函数str()经常用于print()方法,帮我们查看对象的信息,所以我们经常会对_str_()进行重写 我么先来创建一个类 class Slowsnail(object): #...
pythonobject是什么数据类型_跟老齐学Python之数据类型总结
weixin_39975055的博客
11-24 3681
下面的表格中列出了已经学习过的数据类型,也是python的核心数据类型之一部分,这些都被称之为内置对象。对象,就是你面对的所有东西都是对象,看官要逐渐熟悉这个称呼。所有的数据类型,就是一种对象。英文单词是object,直接的汉语意思是物体,这就好像我们在现实中一样,把很多我们看到和用到的都可以统称为“东西”一样。“东西”就是“对象”,就是object。在编程中,那个所谓面向对象,也可以说成“面向东...
Python中的类(Class)和对象(Object
这家伙很懒,什么都没有留下
12-01 4094
类是创建对象的模板。它定义了一个对象的属性和方法。属性是在对象中存储的数据,而方法是可以在对象上执行的操作。在Python中,使用class关键字定义类。def __init__(self): # 构造函数,在创建新对象时自动调用self.attribute = "Hello" # 属性定义def method(self): # 方法定义本文详细介绍了Python中的类(Class)和对象(Object)的概念和应用场景。类是对象的模板或蓝图,而对象是类的实例。
(Gc Poaran Fils (oza6)Nirous sit 10NBb42.8.1941 Of noiD” EDPX APjbit_nate bilitap xtnNt- yto - .Malere rcumoml retai.cojuilstampt brcytr-别leelproctuol tmx.oy J tbilstb.win32-cpython-39pycocotools_mask.cp39-win_amd654.pyd /TNPLTB:build\temp.win2-cpython-39)ReleaseY./comonl_mask.cp39-win_amd64.1lib 正在创建库 build\temp.win2-cpython-39NRelease ,./comon l mask.cp59-win amd84.1ib和对象Cbuild tep.in放2-cpytho -N9 ielese .lcomonl msk.p9- min ambo4.cp_mask.obj : error LNK2001:无法解析的外部符号_imp__PyBaseObject_Type _mask.obj : error LNK2001:无法解析的外部符号_imp___Pyobject_SetAttr _mask.obj : error LNK2001:无法解析的外部符号_imp__PyUnicode_InternFromString_mask.obj : error LNK2001:无法解析的外部符号__imp__PyCFunction_Type _mask.obj : error LNK2001:无法解析的外部符号_imp_PyOs_snprintf_mask.obj : error LNK2001:无法解析的外部符号_imp__PyThreadstate_Get_mask.obj : error LNK2001:无法解析的外部符号_imp_PyExc_Exception_mask.obj : error LNK2001:无法解析的外部符号二imp___PyErr_setobject_mask.obj : error LNK2001:无法解析的外部符号_imp__PyCode_NewEmpty _mask.obj : error LNK2001:无法解析的外部符号_imp_PyErr_GivenExceptionMatches_mask.obj : error LNK2001:无法解析的外部符号_imp_PyLong_AsUnsignedLong _mask.obj : error LNK2001:无法解析的外部符号_imp__PyErr_WarnEx
07-23
这个错误可能是由于编译器无法找到所需的Python库文件导致的。你可以尝试以下解决方案: 1. 确保你的Python环境已正确安装并配置。请检查Python的安装路径是否正确添加到系统的环境变量中。 2. 检查你正在使用的...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • abaqus单位怎么设置_ABAQUS入门常见问题 18866
  • 天正自定义填充图案怎么添加_CAD自定义图案填充,填充参数更换图案步骤演示... 15221
  • gb g t计算机单位,t和g的换算(硬盘容量G跟T的换算) 9664
  • 指数随机变量 泊松过程跳_足球比赛的进球规律-泊松分布 8797
  • 马斯洛需求的五个层次_马斯洛需求层次论 7706

大家在看

  • 基于51单片机煤气天然气泄露GSM短信报警器设计
  • 【Unity每日一记】如何在Unity里面添加视频,做媒体屏幕 633
  • 基于STC12单片机智能安全用电监测设计
  • 基于Java+Vue+Mysql的人力资源管理系统:围绕企业员工全生命周期管理(完整源码)
  • HTML基础知识

最新文章

  • 天刀服务器的位置2018,2018天刀哪区人多 | 手游网游页游攻略大全
  • ajax上传图片springmvc,ajax异步上传图片&SpringMVC后台代码
  • 海淀服务器维修,服务器维修服务器维修防御升级、数据恢复、对接出错等维修服务...
2021年159篇
2020年223篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司邵阳网络广告推广萍乡网站搜索优化报价晋中网站推广工具价格六安关键词按天扣费汉中网站优化按天扣费报价长治外贸网站建设崇左网站推广方案推荐菏泽营销型网站建设公司白城网站排名优化公司淄博建网站公司延边网站搜索优化公司厦门营销型网站建设报价海口网站优化推广杭州关键词按天计费晋中百度关键词包年推广多少钱邯郸网站推广系统多少钱长葛seo网站优化价格上饶网站优化按天收费多少钱六安SEO按天扣费鸡西优化延边seo哪家好阜新百度标王多少钱辽阳百度网站优化排名报价马鞍山营销网站公司乌海建网站价格关键词按天扣费哪家好淮北网站推广方案推荐张家界企业网站制作渭南seo网站优化价格湛江SEO按天扣费哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化