美文网首页
Python对象模型

Python对象模型

作者: xdm | 来源:发表于2021-07-16 11:27 被阅读0次

一切皆对象

基本类型的数据是对象
不同于其他编程语言,在python中,基本类型的数据也是对象,例如一个int类型的数字是一个对象,一个str类型的字符串也是一个对象python不在区分基本类型对象,所有的基本类型内部均由对象实现。以int整数为例,学习过python的人都知道,在pythonint类型的整数可以表示的范围是无限大的,那它在python内部是怎样实现的呢,答案是整数数组,这里的整数数组中的整数是指C语言中的整数

>>> a = 1
>>> b = 'abc'

类型本身是对象
python中,类型本身也是对象,不管是基本的类型还是自定义的类型,在python中也都是对象,int类型是对象,str类型是对象,class定义的类型也是对象。

>>> int
<class 'int'>
>>>
>>> str
<class 'str'>
>>>
>>> class C:
...     pass
... 
>>> C
<class '__main__.C'>

python中,我们可以把基本类型和自定义类型称为类型对象,把通过类型对象实例化得到的对象成为实例对象

image.png

类型、对象体系
我们都知道,编程语言中对象都是有自己的类型的,上面写的a=1,大家都知道实例对象a的类型是类型对象 int,那么问题来了,既然在python中类型int也是对象,称之为类型对象,那么int类型对象类型是什么呢?在python中使用内置的type函数可以获取到对象的类型。

>>> type(int)
<class 'type'>
>>> 
>>> type(str)
<class 'type'>

可以看到,int类型对象类型type,实际上不是内置的类型对象的类型是type,所有的自定义的类型对象的类型也是type

>>> class C:
...     pass
... 
>>> type(C)
<class 'type'>

python中一切皆对象,type也是对象,那么现在问题来了type对象的类型是什么呢?

>>> type(type)
<class 'type'>

很惊奇的发现type对象的类型竟然是type本身。到此,我们可以得到一个类型关系图。

image.png

大家都知道在python3中所有的自定义类型无论是否显示的声明都默认继承object类型,其实内置类型也都是继承自object对象的

>>> issubclass(int, object)
True
>>>
>>> class C:
...     pass
... 
>>> issubclass(C, object)
True

可以很清晰的使用内置的issubclass函数判断出所有类型对象都继承自objectobject就是python继承链的最顶端,object不可以继承其他的类型,因为在python对象属性的查找需要一个终点。现在又有一个问题,object是哪一种类型的创建的呢?

>>> type(object)
<class 'type'>
>>> 
>>> issubclass(type, object)
True

通过上面的代码,很明显,python中object类型对象的类型是type,而type类型又继承自object。现在把继承关系在类型关系图中添加应该就是下面的样子。

image.png

现在,python中的各种对象的类型和继承关系都一目了然了。图中所有的实体在python中都是以对象的形式存在的,那么在python内部对象到底长什么样呢?接下来的文章会一一分析。

可变对象 与 不可变对象

可变对象:创建后可以修改的对象
不可变对象:创建后不可以修改的对象

可变对象

>>> l = [1, 2, 3]
>>> id(l)
4548721952
>>> l.append(4)
>>> id(l)
4548721952

不可变对象

>>> a = 1
>>> id(a)
4546064800
>>> 
>>> a += 2
>>> id(a)
4546064832

对于不可变对象的修改python会重现创建一个新的对象,让变量名指向新的对象,然后删除旧的对象。

定长对象 与 变长对象

定长对象:对象所占用的内存大小不会随着对象的值的变化而变化的对象
变长对象:对象所占用的内存大小会随着对象的值的变化而变化的对象

可以使用python内置sys模块getsizeof函数获取一个对象的具体占用内存数量,得出的结果单位是字节。

>>> import sys
>>> sys.getsizeof(1)
28
>>> sys.getsizeof(100000000000)
32
>>> sys.getsizeof(1.)
24
>>> sys.getsizeof(100000000000.)
24

上面的演示中得出结论int类型的实例对象是变长对象float类型的实例对象是定长对象python一切皆对象,只有研究对象的内部组成才能知道为什么有些对象是定长的有些对象是变长的,是否长度可变取决于对象的内部构造。

相关文章

  • python对象和垃圾回收

    1. python对象 python使用对象模型来存储数据,python中万物皆对象。python对象有三个特性:...

  • Python数据模型

    Python数据模型理解好Python的数据模型才是真正理解了Python这门语言Python数据模型其实就是对象...

  • python-01基础

    python入门 The Zen of Python 数据模型 在Python中数据被抽象成对象,Python程序...

  • Python对象模型

    一切皆对象 基本类型的数据是对象不同于其他编程语言,在python中,基本类型的数据也是对象,例如一个int类型的...

  • C的模块化与面向对象

    引言 最近尝试看了下《python源码剖析》,看完python的对象模型后,发现python是使用C语言实现了对象...

  • Python学习1:Python对象模型

    1. 对象模型 Python中对象是所有数据的抽象。所有Python程序中的值都由对象或者对象之间的关系表示。 2...

  • Python基础手册8——Python对象

    一、python 对象 Python 使用对象模型来存储数据,构造的任何类型的值都是一个对象(比如我们创建的整数:...

  • [笔记] Python 核心笔记 第四章

    一切都是对象,Python使用对象模型来存储数据。包括变量,函数,类,模块等等 所有的python对象都有三个特性...

  • Python语法特点总结

    1. Python对象模型 Python中一切皆为对象。 对象拥有三个特性:id、类型和值。 类把数据与功能绑定在...

  • python 数据模型

    数据模型(译) 1 对象(object)、类型(type)和值(value) python中所有的数据都是通过对象...

网友评论

      本文标题:Python对象模型

      本文链接:https://www.haomeiwen.com/subject/ydoppltx.html