Python数据模型与Python对象模型的相关总结


Posted in Python onJanuary 26, 2021

数据模型==对象模型

Python官方文档说法是“Python数据模型”,大多数Python书籍作者说法是“Python对象模型”,它们是一个意思,表示“计算机编程语言中对象的属性”。这句话有点抽象,只要知道对象是Python对数据的抽象,在Python中万物皆对象就可以了。

官方文档严谨说法,Python程序中的所有数据都是用对象或对象之间的关系来表示的。

对象三要素

对象有三个要素:编号(identity)、类型(type)、值(value)。

identity

编号就是对象的内存地址,从创建后就不会改变。is运算符用来比较2个对象的编号。id()函数返回对象编号的整数表示。

identity也可以翻译为身份,对象身份。

type

类型决定了可以对对象做哪些操作,也定义了对象的可能值,比如intbool类型的值就不一样。type()函数返回对象类型。很多人会误以为Python是弱类型语言,其实Python是强类型语言,这个误解的真实原因是,Python不需要编译,不需要提前知道变量的类型,在运行时才检查类型,这应该叫做动态语言。

JavaScript是弱类型语言,在Python中1+"2"会运行失败,在JavaScript中能运行成功。

类型在创建后也不会改变,虽然可以进行类型转换,但转换实际会产生新对象:

a = 1
print(id(a))
print(id(str(a)))
print(id(a))

结果为:

140715000207008
2136059506160
140715000207008

value

对象三要素中唯一能改变的就只有值了。官网有一句正确的废话:允许改变值的对象是mutable(可变的),不允许改变值的对象是immutable(不可变的)。它的意义在于当不可变对象的值是对可变对象的引用时,该如何判断对象的可变性?结论是不可变对象仍然是不可变的,因为这个引用是不能变的,但是我们通常会认为这个不可变对象的值是可变的,尤其是对象容器。对象类型也会决定是否可变,比如numbersstringstuples是不可变的,dictionarieslists是可变的。

对象容器

有些对象包含了对其他对象的引用,这叫做containers对象容器,比如tupleslistsdictionaries。大多数情况下,我们说容器的值,说的是引用的对象的值,而不是引用编号。但讨论容器可变性时,则仅仅是指容器直接包含的引用编号。比如tuple是不可变的,如果它包含了对一个可变对象的引用后,当该可变对象改变时容器的值也会改变。

对象回收

对象不会被显式销毁,但是它们会被当做垃圾回收,只要不存在对象引用,这就是Python垃圾回收机制!垃圾回收机制比较复杂,比如循环引用,实际上已经没有使用了,但是还存在引用等,涉及到算法规则,等写完Python进阶,在写Python原理时做进一步研究。

Python垃圾回收机制不是银弹,不能解决所有问题,所以在引用外部资源,比如打开文件后,我们需要注意显式close,防止资源始终占用内存,无法释放,造成内存泄漏。close除了手动调用close()方法外,也可以使用with来自动close。

使用try...except可能会让对象继续存活。

类型决定一切

对象的类型几乎决定了对象的一切行为,甚至是对象编号,比如对于不可变类型:

a = 1
b = 1

a和b可能会指向同一个值为1的对象,也可能会指向两个不同的值为1的对象,这取决于具体实现。

但是对于可变类型:

c = []
d = []

c和d一定会指向两个不同的单独的空列表。

注意c = d = [] 则是将同一个对象赋值给 c 和 d。

小结

Python数据模型就是常说的对象模型,万物皆对象,有编号、类型、值三个要素。了解了对象模型后,Python另一个重要概念即将浮出水面,它就是数据结构。

参考资料:

https://docs.python.org/3/reference/datamodel.html

以上就是Python数据模型与Python对象模型的相关总结的详细内容,更多关于python数据模型与对象模型的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用python编写脚本获取手机当前应用apk的信息
Jul 21 Python
简单介绍Python的Tornado框架中的协程异步实现原理
Apr 23 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
python+opencv+caffe+摄像头做目标检测的实例代码
Aug 03 Python
解决Shell执行python文件,传参空格引起的问题
Oct 30 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
QML实现钟表效果
Jun 02 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
Python Selenium异常处理的实例分析
Feb 28 Python
python批量更改目录名/文件名的方法
Apr 18 Python
使用豆瓣源来安装python中的第三方库方法
Jan 26 #Python
详解用selenium来下载小姐姐图片并保存
Jan 26 #Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 #Python
详解Python中的Lock和Rlock
Jan 26 #Python
5分钟快速掌握Python定时任务框架的实现
Jan 26 #Python
Python爬虫自动化爬取b站实时弹幕实例方法
Jan 26 #Python
python 实现的车牌识别项目
Jan 25 #Python
You might like
PHP对象转换为数组函数(递归方法)
2012/02/04 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
2014/10/27 PHP
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
2011/12/20 Javascript
仿百度输入框智能提示的js代码
2013/08/22 Javascript
Javascript保存网页为图片借助于html2canvas库实现
2014/09/05 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
基于JavaScript代码实现自动生成表格
2016/06/15 Javascript
详解微信小程序——自定义圆形进度条
2016/12/29 Javascript
浅析vue数据绑定
2017/01/17 Javascript
Mongoose学习全面理解(推荐)
2017/01/21 Javascript
Javascript操作dom对象之select全面解析
2017/04/24 Javascript
JS实现批量上传文件并显示进度功能
2017/06/27 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
理解 JavaScript EventEmitter
2018/03/29 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
浅谈vue项目用到的mock数据接口的两种方式
2019/10/09 Javascript
javascript 设计模式之组合模式原理与应用详解
2020/04/08 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
初学python数组的处理代码
2011/01/04 Python
Python编程实现二分法和牛顿迭代法求平方根代码
2017/12/04 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
Python generator生成器和yield表达式详解
2019/08/08 Python
Django使用Profile扩展User模块方式
2020/05/14 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
欧舒丹加拿大官网:L’Occitane加拿大
2017/10/29 全球购物
彪马英国官网:PUMA英国
2019/02/11 全球购物
企业消防安全制度
2014/02/02 职场文书
市场开发计划书
2014/05/07 职场文书
啤酒节策划方案
2014/05/28 职场文书
财政专业大学生职业生涯规划书
2014/09/17 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS