python 的 object 与type的关系

news2024/11/19 1:21:52

python 的 object 与type的关系 是并列关系,两种是相互依赖的

查询父类

type.__bases__
object.__bases__

(<class ‘object’>,)
()
查询类型

type(type)
type(object)

<class ‘type’>
<class ‘type’>

在python中,type用于描述类型信息,object用于描述继承关系
object是所有类的父类,包括type
object是type的实例,所有类型都是type的实例
type 站在 类型实例关系金字塔 的顶端
object 站在继承金字塔的顶端
在这里插入图片描述
python这样做,才会有那句 一切都是对象,可以动态得修改 类型 和 类

在python层面是无法理解这样是怎么做到的,需要在c的层面

类型对象的类型:PyType_Type

我们知道了 type 在底层对应 PyType_Type,而它在 “Object/typeobject.c” 中定义,因为我们说所有的类型对象加上元类都是要预先定义好的,所以在源码中就必须要以静态全局变量的形式出现。

PyTypeObject PyType_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "type",                                     /* tp_name */
    sizeof(PyHeapTypeObject),                   /* tp_basicsize */
    sizeof(PyMemberDef),                        /* tp_itemsize */
    (destructor)type_dealloc,                   /* tp_dealloc */

    // ...
    (reprfunc)type_repr,                        /* tp_repr */

    // ...
};

所有的类型对象加上元类都是 PyTypeObject 这个结构体实例化得到的,所以它们内部的成员都是一样的,只不过传入的值不同,实例化之后的结果也不同,可以是 PyLong_Type、可以是 PyFloat_Type,也可以是这里的 PyType_Type。

里面的宏 PyVarObject_HEAD_INIT,我们看到它传递的是一个 &PyType_Type,说明它把自身的类型也设置成了 PyType_Type。换句话说,PyType_Type 里面的 ob_type 成员指向的还是 PyType_Type。
所以所有类型的类型都是type

类型对象的基类:PyBaseObject_Type

类型对象内部的 tp_base 表示继承的基类,那么对于PyType_Type来讲,它内部的 tp_base 肯定是PyBaseObject_Type(object)。但它的 tp_base 居然是个 0,如果为 0 的话则表示没有这个属性。

为 0 的原因就在于我们目前看到的类型对象是一个半成品,因为 Python 的动态性,显然不可能在定义的时候就将所有成员属性都设置好、然后解释器一启动就会得到我们平时使用的类型对象。

目前看到的类型对象是一个半成品,有一部分成员属性是在解释器启动之后再进行动态完善的。
PyBaseObject_Type 位于 Object/object.c 中,

PyTypeObject PyBaseObject_Type = {
    PyVarObject_HEAD_INIT(&PyType_Type, 0)
    "object",                                   /* tp_name */
    sizeof(PyObject),                           /* tp_basicsize */
    0,                                          /* tp_itemsize */
    object_dealloc,                             /* tp_dealloc */

    // ...
    object_repr,                                /* tp_repr */
    // ...
};

我们看到PyBaseObject_Type的类型也被设置成了PyType_Type

而PyType_Type类型对象在被完善之后,它的 tp_base 也会指向PyBaseObject_Type。所以之前我们说 Python 中的 type 和 object 是同时出现的,它们的定义是需要依赖彼此的。

参考资料
《源码探秘 CPython》3. type 和 object 的恩怨纠葛
Python 的 type 和 object 之间是怎么一种关系?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker之Docker网络

Docker网络 1. 理解Docker01.1 测试1.2 原理1.3 小结 2. -link3. 自定义网络3.1 网络模式3.2 测试3.3 自定义网络 4. 网络连通5. 实战&#xff1a;部署Redis集群6. 总结 1. 理解Docker0 清空所有环境 docker rm -f $(docker ps -aq) docker rmi -f $(docker images -aq)1.1 测…

51.现有移动端开源框架及其特点—PocketFlow-1

51.1 简介 全球首个自动模型压缩框架一款面向移动端AI开发者的自动模型压缩框架,集成了当前主流的模型压缩与训练算法,结合自研超参数优化组件实现了全程自动化托管式的模型压缩与加速。 开发者无需了解具体算法细节,即可快速地将AI技术部署到移动端产品上,实现了自动托管式…

Java项目打包exe运行文件

Java项目打包exe运行文件 JavaSE打包成exe运行文件的方法有很多种&#xff0c;此处我们主要讲解我常用的一种exe4j&#xff0c;打包前我们需要先安装exe4j这个工具。 注意&#xff1a;exe4j仅支持最低JDK1.8最高JDK11&#xff0c;所以在安装之前一定要查看自己的JDK版本&#…

银行数字化转型导师坚鹏:数字化时代普惠金融模式和产品创新

数字化时代普惠金融模式和产品创新 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚普惠金融的机遇与挑战&#xff1f; 不知道普惠金融模式和产品如何创新&#xff1f; 不知道普惠金融产品创新的成功案例&#xff1f; 课程特色&#xff1a; 用实战案例…

使用Docker安装Zookpeer集群

1&#xff09;需要提前安装python和docker-compose 注&#xff1a;sudo权限看自己机器的权限 安装python-pip&#xff1a;sudo yum -y install epel-releasesudo yum -y install python-pip安装docker-compose&#xff1a;sudo pip install docker-compose 注意在安装过程中很…

FileZilla密钥登录

使用密码登录非常的方便&#xff0c;但是有的客户的云服务器上是限定只能通过密钥登录。我一般使用命令行的scp命令就可以正常上传&#xff0c;但是对于我一些同事来说&#xff0c;就很不方便。 生成密钥 这个不难&#xff0c;可以参考我之前的文章。 《Mac使用ssh连接远程服…

实验07:子集和问题

1.实验目的&#xff1a; 深刻理解回溯法的基本思想&#xff0c;掌握回溯法解决问题的一般步骤&#xff0c;学会使用回溯法解决实际问题.运用所熟悉的编程工具&#xff0c;借助回溯法的思想求解子集和数的问题。 2.实验内容&#xff1a; 给定 n n n 个正整数 { x 1 , x 2 ,…

springboot 接口防刷(根据IP与路径限制)

接口防刷 一、全局接口防刷&#xff08;通过拦截器方式&#xff09;1、原理 代码示例 二、个别接口防刷&#xff08;接口注解方式)1、代码示例 一、全局接口防刷&#xff08;通过拦截器方式&#xff09; 1、原理 代码示例 通过ip地址uri拼接用以作为访问者访问接口区分通过…

NX状态检测

输入 sudo -H pip install jetson-stats 如果提示没有pip&#xff0c;那么就输入 sudo apt-get install python-pip 之后输入 sudo jtop进行监测 用这个方法可以看到当前Jetpack的版本

记录 Vite 报错 process is not defined 报错问题

由于导入别人开发好的插件&#xff0c;在开发的时候报了process is not defined的错误&#xff0c;记录一下解决方式&#xff0c;方便后续使用。 1.查看里面具体的报错信息是找不到process这个问题。 原因&#xff1a; process.env 已经被遗弃&#xff08;我个人查询百度&…

lwip - 链路层收发以太网数据帧

1、以太网帧结构 数据包在以太网物理介质上传播之前必须封装头部和尾部信息。封装后的数据包称为数据帧&#xff0c;数据帧的封装的信息决定了数据如何传输。   以太网中传输的帧有两种格式&#xff0c;IEEE 802.3 和 Ethernet II&#xff0c;选择哪种格式由TCP/IP协议簇中的…

光伏太阳能直流浪涌保护器应用方案

由于用于光伏装置的直流电涌保护设备必须设计为完全暴露在阳光下&#xff0c;因此它们极易受到雷电的影响。光伏阵列的容量与其暴露的表面积直接相关&#xff0c;因此闪电事件的潜在影响随着系统规模的增加而增加。在照明频繁发生的情况下&#xff0c;未受保护的光伏系统可能会…

pytorch中BatchNorm2d的实验验证

BatchNorm2d 对二维矩阵进行批量归一化&#xff0c;mean为当前batch的均值&#xff0c;std为当前batch的标准差&#xff0c;使用批量归一化能够将取值范围不同的数据映射到标准正态分布的区间中&#xff0c;减少数据之间的差距&#xff0c;方便模型快速收敛。批量归一化本质上…

Vivado增量编译:加速FPGA设计实现的利器

随着FPGA设计的复杂度不断提高&#xff0c;设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中&#xff0c;Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基本概念、优点、使用方法以及注意事项。 通过阅读本文可以了解&#xff1…

大多数开发人员都不知道的JSON.stringify 秘密

作为前端开发工程师&#xff0c;你一定用过JSON.stringify&#xff0c;但你知道它的全部秘密吗&#xff1f; 基本上&#xff0c;JSON.stringify 将对象转换为 JSON 字符串。同时&#xff0c;JSON.stringify 有如下规则&#xff1a; JSON.stringify({name: Tom, age: 18}) {&q…

银行数字化转型导师坚鹏:数字人民币创新及金融场景应用

数字人民币创新及金融场景应用 课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚数字人民币的发展历程&#xff1f; 不清楚数字人民币对我们有什么影响&#xff1f; 不知道数字人民币具体应用场景&#xff1f; 课程特色&#xff1a; 前沿性&#xff1a…

【c语言】带你快速理解函数的传值和传址

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

大数据 | 实验一:大数据系统基本实验 | 熟悉常用的HBase操作

文章目录 &#x1f4da;HBase安装&#x1f407;安装HBase&#x1f407;伪分布式模式配置&#x1f407;测试运行HBase&#x1f407;HBase java API编程环境配置 &#x1f4da;实验目的&#x1f4da;实验平台&#x1f4da;实验内容&#x1f407;HBase Shell 编程命令实现以下指定…

【天梯赛补题】

175对我这种蒟蒻好难&#xff0c;&#xff0c;&#xff0c; L1-6剪切粘贴 题目详情 - L1-094 剪切粘贴 (pintia.cn) 天梯赛&#xff1a;L1-094 剪切粘贴_scarecrow133的博客-CSDN博客 本蒟蒻看到字符串就害怕&#xff0c;一看就没思路&#xff0c;果断跳过了…… 等佬佬讲…

表的查询内容

表的查询 这里是关键的select的使用对表不同的条件进行筛选&#xff0c;实现对于内容的书写 全列查询 使用*进行查询&#xff0c;表现的是整个表的内容。 指定列查询 name的id列信息查询 查询字段为表达式 这里的id加上10&#xff0c;形成了新的列表 这里的id1 id的结果聚合在…