第二章对象模型(1)
文章目录
- 对象模型的概述
- 接下来我们就要搞清楚类型和对象体系
- 到这里我们已经知道了所有对象都有一个类型,并且统统继承自 object,这样 对象,object, type, 三者的关系变得很神秘,我们先来介绍下
- type 和object 两个特殊的类型
- 变量只是一个名字
- 可变对象与不可变对象
- 总结:这就是初步的内容,理解和知道这些概念后,下节书中就会深入python源码,在C语言层面讲解这些东西的实现。
对象模型的概述
首先我们要始终铭记一句话:python是一门面向对象的语言! 并且面向的彻底,可以称为 一切皆对象。
这句话说起来简单,如要真正的让你论述其正确性,这就需要很深的功底去理解。
- 列举常见的对象
1. 例如我们常讲的类 ,它就是 对象。类的细致描述就是类型,再细致解释说就是类型对象,比如:a = 3 # a 是 int类型 b = 'hello' # b 是字符串类型
接着 我们通过class 关键字定义的类,也称为自定义类型对象
通过类(类型对象)实例化得到的实例化对象
>>> 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)相关推荐
- 3-8《Ruby元编程》第二章对象模型
<Ruby元编程> 第二章 对象模型 类定义揭秘inside class definitions: class关键字更像一个作用域操作符,核心作用是可以在里面随时定义方法. [].meth ...
- ppk on JavaScript第二章:背景(完结篇)
无障碍规则 尽管无法预见可能损害一个有脚本网站的可用性的所有情形,但我已经总结出一些可以帮助您在基础上不犯错的规则.不要把它们当作JavaScript和无障碍的终极规则,这只是能防止一些常见低级错误的 ...
- 【Git】版本控制管理(第二版) 前言 第一章 第二章
版本控制管理 前言 第一章 第二章 资源 前言 本书结构 第一章 介绍 总结在开头 1.1 背景 1.2 Git的诞生 1.3 先例 1.4 时间线 第二章 安装Git 2.1 使用Linux上的二进 ...
- 网易云课堂[Web安全工程师]第一部分 第二章WEB简介 学习记录
[仍旧写在前面 个人学习笔记] 第一部分 WEB基础知识 第二章 WEB基础知识 第一节 前端开发基础--HTML课后小测验 1 HTML页面的注释符号是那种?<!-- --> 2 若要在 ...
- C++ API 设计 07 第二章
第二章 品质 本章的目标是回答下面的问题:一个良好的API需要什么样的品质?大多数开发人员都同意,一个良好的API应该设计得很优雅,而且仍然非常容易使用.它应该在后台运行且使用起来让你觉得很惬意.这些 ...
- 第二章 Qt编程核心技术
QT编程核心技术介绍 第二章 Qt编程核心技术 Qt/X11与Qt/Embedded版本的Qt类库,尽管类的底层实现有一些细微区别,但类的声明及方法函数是一样的,对于编写Qt应用程序的编程者来说,几乎 ...
- JavaWeb 第二章 JavaScript
第二章 JavaScript 学习目标 了解JavaScript的起源与特性 掌握JavaScript的基本语法 掌握JavaScript的DOM 掌握JavaScript的事件绑定 掌握正则表达式的 ...
- 网页设计与制作:第一章HTML与CSS网页设计概述与第二章HTML入门
第一节:Web基本概念 1,认识网页 (1)网页主要有文字,图像和超链接等元素构成: 2,名词解释 (1)internet:就是通常所说的因特网,是由一些使用公用语言互相通信的计算机连接而成的网络. ...
- 王道考研 计算机网络笔记 第二章:物理层
本文基于2019 王道考研 计算机网络: 2019 王道考研 计算机网络 个人笔记总结 第一章:王道考研 计算机网络笔记 第一章:概述&计算机网络体系结构 后续章节将陆续更新- 第二章 一.物 ...
最新文章
- 机器学习基础 --- numpy的基本使用
- 一篇文章读懂麦当劳发行MacCoin是什么
- java c 性能比较_java 中ArrayList与LinkedList性能比较
- .NET Framework基础知识(二)(转载)
- UE4 蓝图RandomStreams
- Redisson 实现分布式锁
- 日志分析平台-ELK
- 造谣“外卖员因差评杀人” 女子被依法刑事拘留
- 数据结构——二叉排序树
- 释放vmware磁盘空间
- 把复杂变简单,能产生颠覆的力量
- hive 如何将数组转成字符串_Hive 字符串操作[转]
- Introduction to Computer Networking学习笔记(十):Finite State Mechines(有限状态机)以TCP连接断开为例
- Java实习日记(6)
- 安装英伟达显卡旧版驱动
- 马云的卸任,刘强东的舆论,万达的动荡,谁将是下一个龙头老大!
- android studio深色模式,Xamarin 中的深色模式
- 邮箱搬家操作步骤及详细说明
- 数据安全法整理学习笔记
- 如何将网易云音乐的歌单同步到spotify
热门文章
- java参数错误,参数不匹配错误java.lang.IllegalArgumentException: argument type mismatch
- [4.6每周质量报告]等离子PK液晶电视
- freeswitch和sofia-sip中关于sip的消息机制
- Cocos2d-x学习笔记三之飞机游戏详解之GameOver类的讲解
- 美国权威机构:2005年美国商学院排座次
- 使用qihoo360签名工具完成对apk的签名
- Qihoo360/wayne安装部署管理Kubernetes(k8s)集群
- SteamVR插件简介
- 全国信息化计算机应用技术资格证书,全国信息化计算机应用技术资格认证
- ENS最新合约源码分析二