返回顶部
首页 > 资讯 > 后端开发 > Python >Python万物皆对象源码分析
  • 272
分享到

Python万物皆对象源码分析

2023-06-30 14:06:12 272人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要讲解了“python万物皆对象源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python万物皆对象源码分析”吧!万物皆对象这篇博客的内容主要是针对Python中万物皆对象

这篇文章主要讲解了“python万物皆对象源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python万物皆对象源码分析”吧!

    万物皆对象

    这篇博客的内容主要是针对Python中万物皆对象的理解,对Python的类型、对象体系做一个整体的梳理。

    在Python中,一切皆为对象,一个整数是一个对象,一个字符串也是一个对象,基本类型(如int)也是对象。Python不再区别对待基本类型和对象,所有的基本类型内部均由对象实现。

    >>> a = int>>> b = 1>>> id(a)140734789683952>>> id(int)140734789683952>>> a<class 'int'>>>> id(b)2421963817200>>> id(1)2421963817200>>> b1

    1 类型对象和实例对象

    Python中的类型是一种对象,称为类型对象。整数类型、字符串类型,以及我们通过class关键字定义的自定义类型也是一个对象。

    通过类实例化可以得到一个实例化对象,称为实例对象

    Python万物皆对象源码分析

    2 类型、对象体系

    2.1 元类型type

    前面我们提到:Python中的类型是一种对象,称为类型对象。那么类型对象的类型又是什么呢?

    >>> type(int)<class 'type'>>>> int.__class__<class 'type'>

    可以看到,类型的类型是type,我们称之为元类型,但是这个类型比较特殊,它的实例对象是类型对象。此外,Python中还有一个特殊的类型object,所有其他类型都继承于object,即object是所有类型的基类。

    图示如下:

    Python万物皆对象源码分析

    2.2 自定义类型

    除了Python的内置类型,我们自定义一个类型MyClass,同样地,可以得到:

    Python万物皆对象源码分析

    2.3 自定义类型子类

    再定义一个类型MySubClass,该类型为MyClass的子类:

    Python万物皆对象源码分析

    2.4 type和object的关系

    在上述示例中,我们描述了不同对象、类型之间的继承、类型关系,但是对于两个特殊的类型type和object的关系并没有指出,我们先来打印看一下:

    >>> type(type)<class 'type'>>>> type(object)<class 'type'>>>> type.__base__<class 'object'>>>> object.__base__>>> print(object.__base__)None

    可以看到:object的类型也是type,type本身的类型也是type;而type的父类也是所有对象的父类&mdash;&mdash;object,而object本身没有父类。由此我们可以归纳出:

    object是所有类型的基类(除了它自己),本质上是一种类型,其类型是type,同时也是type的基类;

    type是所有类型的类型,本质上是一种类型,其类型是它自己,也是object的类型;

    注:object本身不能有基类,这是因为&mdash;&mdash;对于存在继承关系的类,成员属性和成员方法查找需要回溯继承链,不断查找基类。因此,继承链必须有一个终点,不然就会死循环。

    最后我们把type和object的关系补充进来:

    Python万物皆对象源码分析

    3 可变对象与不可变对象

    可变对象在创建之后,其值可以修改;不可变对象在创建之后,其值不可以进行修改。

    以Python中的整数对象为例:整数类型是不可变类型,整数对象是不可变对象。“修改整数对象”时,Python将以新值创建一个新对象,变量名与新对象进行绑定,旧对象如果没有其他引用,则会被释放(通过“小整数池”进行创建回收优化,具体后续介绍,这里先按下不表,后续会补充)。

    图示如下:

    Python万物皆对象源码分析

    以Python中的列表对象为例:列表类型是可变类型,列表对象是可变对象。列表对象内部会维护一个动态数组,存储元素对象的指针,列表对象再增减对象的时候,会修改该数组,而列表对象的“头部”(后续会详细介绍)会保持不变:

    Python万物皆对象源码分析

    4 变长对象和定长对象

    定长对象:对象的内存大小一定

    边长对象:同一类型,不同对象会有不同的大小

    通过sys.getsizeof()可以查看一个对象的大小:

    >>> import sys>>> a = 1>>> b = 1111111111111111111111111111111111111111111111111111111111>>> c = 1.0>>> d = 1.00000000000000000000000000000000000000000000000000000001>>> sys.getsizeof(a)28>>> sys.getsizeof(b)52>>> sys.getsizeof(c)24>>> sys.getsizeof(d)24

    整数对象是变长对象:固定位数的整数能够表示的范围是有限的,故整数对象会随着自身的数值大小而改变自身内存大小。在Python中采用了类似c++中大整数类的思路实现整数对象,通过串联多个普通32位整数来支持更大的数值范围(详细源码后续介绍)。

    浮点数对象是定长对象:根据机组的知识,我们用32位表示单精度浮点数,用64位表示双精度浮点数,它们都是定长的。在Python中,浮点数背后是由一个double来实现的,就算表示很大的数,浮点数对象的大小也不变(这样做的代价是牺牲了精度)。当然,浮点数也是有大小限制的,可以思考下:我们通过float()将一个很大的int转化为float时,是否会报错?Python底层是否做了相应的判断呢?

    5 补充

    变量名:我们创建对象时会为对象分配对应的内存空间,那么我们将变量名和对象绑定时,变量又是如何存储的呢?

    感谢各位的阅读,以上就是“Python万物皆对象源码分析”的内容了,经过本文的学习后,相信大家对Python万物皆对象源码分析这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

    --结束END--

    本文标题: Python万物皆对象源码分析

    本文链接: https://lsjlt.com/news/329608.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Python万物皆对象源码分析
      这篇文章主要讲解了“Python万物皆对象源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python万物皆对象源码分析”吧!万物皆对象这篇博客的内容主要是针对Python中万物皆对象...
      99+
      2023-06-30
    • Python万物皆对象理解及源码学习
      目录万物皆对象1 类型对象和实例对象2 类型、对象体系2.1 元类型type2.2 自定义类型2.3 自定义类型子类2.4 type和object的关系3 可变对象与不可变对象4 变...
      99+
      2024-04-02
    • Python对象的生命周期源码分析
      本篇内容介绍了“Python对象的生命周期源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!思考:当我们输入这个语句的时候,Python...
      99+
      2023-06-30
    • Python源码:str对象
      class str(object):     """     str(object='') -> str     str(bytes_or_buffer[, encoding[, errors]]) -> str        ...
      99+
      2023-01-31
      源码 对象 Python
    • Redis对象与redisObject超详细分析源码层
      目录一、对象二、对象的类型及编码RedisObject 结构体三、不同对象编码规则四、redisObject结构各字段使用范例4.1 类型检查(type字段)4.2 多态命令的实现(encoding)4.3 内存回收和共...
      99+
      2022-11-28
      Redis对象 RedisredisObject RedisredisObject源码
    • 深入源码解析Python中的对象与类型
      对象 对象, 在C语言是如何实现的? Python中对象分为两类: 定长(int等), 非定长(list/dict等) 所有对象都有一些相同的东西, 源码中定义为PyObject和PyVarObje...
      99+
      2022-06-04
      源码 对象 类型
    • 源码分析系列之json_encode()如何转化一个对象
      目录初步测试JsonSerializable源码分析分析Demojson_encode()如何转化一个对象? 使用 json_encode() 将数组 ...
      99+
      2024-04-02
    • 基于java构造方法Vector创建对象源码分析
      (注意:本文基于JDK1.8)  前言 Vector是线程安全的动态数组类,提供4个创建Vector对象的构造方法,接下来我们逐个分析每个创建Vector对象的构造方法 ...
      99+
      2024-04-02
    • 如何用JVM源码分析Java对象的创建过程
      这篇文章将为大家详细讲解有关如何用JVM源码分析Java对象的创建过程,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。基于HotSpot实现对Java对象的创建过程进行深入分析。定义两个简单的...
      99+
      2023-06-17
    • django源码分析 python ma
      django是一个快速开发web应用的框架, 笔者也在django框架上开发不少web应用,闲来无事,就想探究一下django底层到底是如何实现的,本文记录了笔者对django源码的分析过程 I believe to become a ...
      99+
      2023-01-31
      源码 django ma
    • Component与PureComponent对比源码分析
      这篇文章主要介绍了Component与PureComponent对比源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Component与PureComponent对比源码分析文章都会有所收获,下面我们一起...
      99+
      2023-07-05
    • workerman和swoole源码对比分析
      这篇“workerman和swoole源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“workerman和swoo...
      99+
      2023-07-05
    • Netty分布式获取异线程释放对象源码剖析
      目录获取异线程释放对象在介绍之前我们首先看Stack类中的两个属性我们跟到pop方法中继续跟到scavengeSome方法中我们继续分析transfer方法接着我们我们关注一个细节我...
      99+
      2024-04-02
    • SpringBoot启动流程入口参数创建对象源码分析
      目录入口探讨primarySource参数args参数创建对象1、推断web应用类别2、加载Spring应用上下文初始化3、加载Spring应用事件监听器4、推断应用引导类入口 这...
      99+
      2023-05-14
      SpringBoot 启动参数创建 SpringBoot 启动
    • Python列表和集合效率源码对比分析
      这篇“Python列表和集合效率源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python列表和集合效率源码对比...
      99+
      2023-07-06
    • Python中的jieba源码分析
      本篇内容主要讲解“Python中的jieba源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的jieba源码分析”吧!前言jieba分词是Python 里面几个比较流行的中文...
      99+
      2023-06-02
    • python架构PyNeuraLogic源码分析
      这篇“python架构PyNeuraLogic源码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python架构PyNe...
      99+
      2023-07-05
    • 从源码解析Python的Flask框架中request对象的用法
      from flask import request Flask 是一个人气非常高的Python Web框架,笔者也拿它写过一些大大小小的项目,Flask 有一个特性我非常的喜欢,就是无论在什么地方,如果你想...
      99+
      2022-06-04
      源码 框架 对象
    • Python面向对象中类和对象的示例分析
      这篇文章主要介绍了Python面向对象中类和对象的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是面向对象编程?我们是不是听过面向过程,拿来放在一起对比就比较好理...
      99+
      2023-06-22
    • Python对象的底层实现源码学习
      目录1. PyObject:对象的基石2. PyVarObject:变长对象的基础2.1 浮点对象2.2 列表对象3. PyTypeObject:类型的基石4. PyType_Typ...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作