第二章对象模型(1)

对象模型的概述

首先我们要始终铭记一句话:python是一门面向对象的语言! 并且面向的彻底,可以称为 一切皆对象。
这句话说起来简单,如要真正的让你论述其正确性,这就需要很深的功底去理解。

  • 列举常见的对象
    1. 例如我们常讲的 ,它就是 对象。类的细致描述就是类型,再细致解释说就是类型对象,比如:
    a = 3  # a 是 int类型
    b = 'hello' # b 是字符串类型
    
    接着 我们通过class 关键字定义的,也称为自定义类型对象
  1. 通过类(类型对象)实例化得到的实例化对象

    >>> int('1024')
    1024
    

这是要知道类和对象的基本概念:
在这里插入图片描述

接下来我们就要搞清楚类型和对象体系

1.对类型的初步理解:

如上所述, a = 3, a是一个整数对象(实例对象),其类型是整数类型( 类型对象 ),这里引入书中例子:

>>> a = 1
>>> type(a)
<class 'int'>
>>> isinstance(a, int)   # 此方法用于检验实例对象是否属于该类型,不懂得可以阅读官方文档进行理解
True

那么我们引出问题既然对象都有类型,那么 整数类型对象int,的类型是什么?

>>> type(int)
<class 'type'>  # 类型为type

这就是特殊的地方! 新手的认知总是知道,类的实例化是 实例化对象,但是这里, int(类型对象)的类型 还是一种类型,也就是说 type类型的实例化对象 还是一个类型对象(int)

python中我们知道有一个特殊的基类 object,是一种特殊的类型对象,其他任何类型均继承自object, 也就是说,object是所有类型的基类!

>>> issubclass(int, object)  # 此方法用于判断类的继承关系
True

再次引入书中的图像:
在这里插入图片描述
我们自己创建的对象,同样是继承自 object类:
在这里插入图片描述
我们创建的类的继承关系,依旧符合该原理:Sleuth 类型继承自 Dog类型
在这里插入图片描述

到这里我们已经知道了所有对象都有一个类型,并且统统继承自 object,这样 对象,object, type, 三者的关系变得很神秘,我们先来介绍下

type 和object 两个特殊的类型

  • 理论上讲, object是所有类型的基类,但是本质上面还是一种类型。所以它的类型必然是type

  • 并且object是所有类型的基类,所以 理论上也是type基类

  • 而type是所有类型的 类型,所以它的类型必须是它自己!

  • object 自身不能拥有基类,因为继承必须有一个终点,不然变回陷入死循环。

    这些概念听起来很错乱,下面可以通过例子理解下:

>>> type(object)
<class 'type'>
>>> type(object) is type
True

>>> type(type)
<class 'type'>
>>> type(type) is type
True

>>> issubclass(type, object)  # 这个内置函数,用于检验继承关系
True
>>> type.__base__
<class 'object'>

我们在引入一张书中的图表,那么python的类型系统就介绍完善了!
在这里插入图片描述
(该图将成为后续阅读源码、探索 Python 对象模型的有力工具,像地图一样指明方向)

变量只是一个名字

python中,一切皆对象。所以变量 不过是一个与对象关联的名字

  • 变量赋值: 就是将当前对象 与另一个名字关联。例如

    >>> a = 1
    >>> id(a)
    4302704784
    
    >>> b = a
    >>> id(b)
    4302704784
    
    

变量赋值知识拷贝指针,并不拷贝指针背后的对象,这点与C语言不同
```

可变对象与不可变对象

  • 既然python一切皆对象,那么对象也是区分的

  • 首先可变对象
    * 可变对象 在对象创建后,其值可以进行修改;
    * 举例 :例如列表,往列表里面追加元素,并不改变其对象

    >>> l = [1, 2]
    >>> l
    [1, 2]
    >>> id(l)
    4385900424
    
    >>> l.append(3)
    >>> l
    [1, 2, 3]
    >>> id(l)
    4385900424
    
      * 实际上列表对象内部维系了一个动态数组,存储元素的指针。我们在以后细致说明 ,引入书中图片
    

在这里插入图片描述

  • 不可变对象:
    * 而 不可变对象 在对象创建后的整个生命周期,其值都不可修改。
    * 举例子,整数类型是不可变对象
    在这里插入图片描述
    修改整数对象时, Python 将以新数值创建一个新对象,变量名与新对象进行绑定; 旧对象如无其他引用,将被释放!

  • 定长对象 :整数对象的大小跟其数值有关,像这样 大小不固定 的对象称为 变长对象
    通过书中例子:

>>> sys.getsizeof(1)  
28
>>> sys.getsizeof(100000000000000000)
32
>>> sys.getsizeof(100000000000000000000000000000000000000000000)
44

说明:位数固定的整数能够表示的数值范围是有限的,可能导致 溢出 。 Python 为解决这个问题,采用类似 C++ 中 大整数类 的思路实现整数对象—— 串联多个普通 32 位整数,以便支持更大的数值范围。 至于需要多少个 32 位整数,则视具体数值而定,数值不大的一个足矣,避免浪费(书中原话)

在这里插入图片描述

*	浮点数对象 float :
>>> sys.getsizeof(1.)
24
>>> sys.getsizeof(1000000000000000000000000000000000.)
24

在这里插入图片描述

  • 变长对象:
    字符串对象:
>>> sys.getsizeof('a')
50
>>> sys.getsizeof('abc')
52

总结:这就是初步的内容,理解和知道这些概念后,下节书中就会深入python源码,在C语言层面讲解这些东西的实现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值