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 >>> 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作用域与名字空间
以上就是Python万物皆对象理解及源码学习的详细内容,更多关于Python对象的资料请关注猪先飞其它相关文章!
原文出处:https://blog.csdn.net/xiaoli_Jenny/article/details/123993111
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
Python astype(np.float)函数使用方法解析
这篇文章主要介绍了Python astype(np.float)函数使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-06-08- 2022虎年新年即将来临,小编为大家带来了一个利用Python编写的虎年烟花特效,堪称全网最绚烂,文中的示例代码简洁易懂,感兴趣的同学可以动手试一试...2022-02-14
- 在本篇文章里小编给大家分享的是一篇关于python中numpy.empty()函数实例讲解内容,对此有兴趣的朋友们可以学习下。...2021-02-06
python-for x in range的用法(注意要点、细节)
这篇文章主要介绍了python-for x in range的用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-10- 这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
- 这篇文章主要介绍了Python中的imread()函数用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要介绍了python如何实现b站直播自动发送弹幕,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-02-20
- 这篇文章主要介绍了R语言删除指定变量或对象的操作方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
python Matplotlib基础--如何添加文本和标注
这篇文章主要介绍了python Matplotlib基础--如何添加文本和标注,帮助大家更好的利用Matplotlib绘制图表,感兴趣的朋友可以了解下...2021-01-26- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 今天小编就为大家分享一篇python 计算方位角实例(根据两点的坐标计算),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-04-27
- 这篇文章主要为大家详细介绍了python实现双色球随机选号,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-05-02
- 在本篇文章里小编给大家整理的是一篇关于python中使用np.delete()的实例方法,对此有兴趣的朋友们可以学习参考下。...2021-02-01
- 这篇文章主要介绍了JavaScript预解析,对象的的相关资料,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...2021-11-10
- 这篇文章主要介绍了使用Python的pencolor函数实现渐变色功能,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-09
- 这篇文章主要介绍了python自动化办公操作PPT的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-05
Python getsizeof()和getsize()区分详解
这篇文章主要介绍了Python getsizeof()和getsize()区分详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-20如何在Spring WebFlux的任何地方获取Request对象
这篇文章主要介绍了如何在Spring WebFlux的任何地方获取Request对象,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下...2021-01-26