python一切皆对象的理解,对象 python

  python一切皆对象的理解,对象 python

  本文主要介绍Python的源代码学习,有需要的朋友可以借鉴一下。希望能有所帮助。祝大家进步很大,早日升职加薪。

  00-1010一切都是对象1类型对象和实例对象2.4类型、对象系统2.1元类型2.2自定义类型2.3自定义类型子类2.4类型和对象的关系3可变对象和不可变对象4可变对象和固定对象5补充

  

目录

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

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

  a=int

  b=1

  id(a)

  140734789683952

  id(整数)

  140734789683952

  一

  类“int”

  身份证(b)

  2421963817200

  身份证(1)

  2421963817200

  乙等

  任何人

  

万物皆对象

  Python中的类型是一种称为类型对象的对象。由class关键字定义的整数类型、字符串类型和自定义类型也是一个对象。

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

  

1 类型对象和实例对象

  

2 类型、对象体系

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

  类型(整数)

  类别“类型”

  里面的__class__

  类别“类型”

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

  图示如下:

  

2.1 元类型type

  除了Python的内置类型,我们还定制了一个类型MyClass。同样,我们可以得到:

  

2.2 自定义类型

  定义另一个类型MySubClass,它是MyClass的子类:

  

2.3 自定义类型子类

  在上面的例子中,我们描述了不同对象和类型之间的继承和类型关系,但是没有指出类型和对象这两个特殊类型之间的关系。先把它打印出来:

  类型(类型)

  类别“类型”

  类型(对象)

  类别“类型”

  类型。__base__

  类“对象”

  对象。__base__

  打印(对象。__base__)

  没有人

  可见,对象的类型也是类型,类型本身也是类型;类型的父类是所有对象。

  的父类——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对象的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: