Python万物皆对象理解及源码学习
作者:Blanker_711 发布时间:2023-05-14 13:34:02
万物皆对象
这篇博客的内容主要是针对Python中万物皆对象的理解,对Python的类型、对象体系做一个整体的梳理。
在Python中,一切皆为对象,一个整数是一个对象,一个字符串也是一个对象,基本类型(如int)也是对象。Python不再区别对待基本类型和对象,所有的基本类型内部均由对象实现。
>>> a = int
>>> b = 1
>>> id(a)
140734789683952
>>> id(int)
140734789683952
>>> a
<class 'int'>
>>> id(b)
2421963817200
>>> id(1)
2421963817200
>>> b
1
1 类型对象和实例对象
Python中的类型是一种对象,称为类型对象。整数类型、字符串类型,以及我们通过class关键字定义的自定义类型也是一个对象。
通过类实例化可以得到一个实例化对象,称为实例对象
2 类型、对象体系
2.1 元类型type
前面我们提到:Python中的类型是一种对象,称为类型对象。那么类型对象的类型又是什么呢?
>>> type(int)
<class 'type'>
>>> int.__class__
<class 'type'>
可以看到,类型的类型是type,我们称之为元类型,但是这个类型比较特殊,它的实例对象是类型对象。此外,Python中还有一个特殊的类型object,所有其他类型都继承于object,即object是所有类型的基类。
图示如下:
2.2 自定义类型
除了Python的内置类型,我们自定义一个类型MyClass,同样地,可以得到:
2.3 自定义类型子类
再定义一个类型MySubClass,该类型为MyClass的子类:
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的父类也是所有对象的父类——object,而object本身没有父类。由此我们可以归纳出:
object是所有类型的基类(除了它自己),本质上是一种类型,其类型是type,同时也是type的基类;
type是所有类型的类型,本质上是一种类型,其类型是它自己,也是object的类型;
注:object本身不能有基类,这是因为——对于存在继承关系的类,成员属性和成员方法查找需要回溯继承链,不断查找基类。因此,继承链必须有一个终点,不然就会死循环。
最后我们把type和object的关系补充进来:
3 可变对象与不可变对象
可变对象在创建之后,其值可以修改;不可变对象在创建之后,其值不可以进行修改。
以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作用域与名字空间
来源:https://blog.csdn.net/xiaoli_Jenny/article/details/123993111


猜你喜欢
- 输出用print加上字符串,就可以向屏幕上输出指定的文字。比如输出'hello, world',用代码实现如下:>&g
- 1、先看效果:熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播。我认为使用图片轮播。第一可以给人以一种美观的感受,而不会显得网站那
- 很多小伙伴对 MySQL 的隔离级别一直心存疑惑,其实这个问题一点都不难,关键看怎么讲!单纯的看理论,绝对让你晕头转向,但是,如果我们通过几
- 看书笔记db file scattered read DB ,db file sequential read DB,free buffer
- 前言本文将记录学习基于 Socket 通信机制建立 TCP 反向连接,借助 Python 脚本实现主机远程控制的目的。我们在传输数据时,可以
- endswith()方法返回true,如果字符串以指定后缀结尾,否则返回(False可选限制的匹配从给定的索引开始和结束)。语法
- 1) 知识准备:为了使用Perl语言去存取mSQL和MySQL数据库的内容,必须安装一些API模块,以下列出一些必须安装的模块名称说明和其下
- 在Mysql中很多表都包含可为NULL(空值)的列,即使应用程序并不需要保存NULL也是如此,这是因为可为NULL是列的默认属性。但我们常在
- 本文实例讲述了gearman+mysql方式实现持久化操作。分享给大家供大家参考,具体如下:1、为什么要持久化?gearman的job se
- PHP引擎php.ini参数优化无论是apache还是nginx,php.ini都是适合的。而php-fpm.conf适合nginx+fcg
- 前言众所周知Json 作为一种重要的数据格式,具有良好的可读性以及自描述性,广泛地应用在各种数据传输场景中。Go 语言里面原生支持了这种数据
- 摘要:近几天在做一个东西,其中需要对图像中的文字进行识别,看了前辈们的文章,找到两个较简单的方法:使用python的pytesseract库
- 推荐阅读:JS iFrame加载慢怎么解决在项目中经常要动态添加iframe,然后再对添加的iframe进行相关操作,而往往iframe还没
- 一、知识介绍:1、input() 函数,接收任意输入,将所有输入默认为字符串处理,并返回字符串类型;2、可以用作文本输入,如用户名,密码框的
- http://swik.net/Ajax/Ajax+Mistakes在某网站瞎逛时,发现这个链接,进去逛了逛,觉得很有意思,大家也可以去看看
- 我们在开发程序的时候,有时候需要开发一些自动化的任务,执行完之后,将结果自动的发送一份邮件,python发送邮件使用smtplib模块,是一
- 前言现如今我们生活在一个二维码的时代,生活中处处都是二维码,支付要使用二维码,微信加好友要使用二维码,乘坐公共交通要使用二维码,那么,如果要
- 1.依次安装python2和python3,并添加到系统环境变量中2.找到python3的安装目录,一般在C:\Users\Administ
- 一.python读取txt文件最简单的open函数:# -*- coding: utf-8 -*-with open("test.
- 前言大家好,这次写作的目的是为了加深对数据可视化pyecharts的认识,也想和大家分享一下。如果下面文章中有错误的地方还请指正,哈哈哈!!