上QQ阅读APP看书,第一时间看更新
0.3.1 Python内的对象
从1989年Guido在圣诞节揭开Python的大幕开始至今,Python经历了一次又一次的升级,但其实现语言一直都是ANSI C。但C并不是一个面向对象的语言,那么在Python中,它的对象机制是如何实现的呢?
对于人来说,对象是一个比较形象的概念;对于计算机来说,对象却是一个抽象的概念,计算机并不能理解这是一个整数,还是一个字符串,所知道的一切都是字节。通常来说,对象是数据以及基于这些数据的操作的集合。在计算机中,一个对象实际上是一个被分配的内存空间,这些内存空间可能是连续的,也可能是离散的。不过,这些都不重要。重要的是,内存可以作为整体来考虑。这个整体就是一个对象。对象内存储着一系列数据以及对这些数据进行修改或读取操作的一系列源码。
在Python中,对象是为C中的结构体在堆上申请的一块内存。一般来说,对象不能被静态初始化,也不能在栈空间上生存。唯一的例外是类型对象,Python中所有的内置类型对象(如整数类型对象,字符串类型对象)都是被静态初始化的。
在Python中,对象一旦被创建,它在内存中的大小就是不变的。这就意味着那些需要容纳可变长度数据的对象只能在对象内维护一个指向一块可变大小内存区域的指针。
为什么要设定这样一条特殊的规则呢?因为遵循这样的规则可以使通过指针维护对象的工作变得非常简单。
一旦允许对象的大小在运行期改变,就很容易出现如下的情形:在内存中有对象A,并且其后紧跟有对象B。如果在运行期某个时刻,A的大小增大,这意味着必须将A整个移动到内存的其他位置,否则A增大的部分将覆盖原本属于B的数据。只要将A移动到内存的其他位置,那么所有指向A的指针就必须立即得到更新。这样的工作非常烦琐,也很容易出错。