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

作者:PythonMind 时间:2021-05-15 02:21:43 

数据模型==对象模型

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

来源:https://www.cnblogs.com/df888/p/14327719.html

标签:python,数据模型,对象模型
0
投稿

猜你喜欢

  • 如何在Django配置文件里配置session链接

    2022-09-08 18:17:33
  • 关于AJAX缓存数据

    2008-03-26 12:11:00
  • Python定时任务APScheduler安装及使用解析

    2023-07-15 02:49:00
  • mac 上配置Pycharm连接远程服务器并实现使用远程服务器Python解释器的方法

    2021-10-19 18:40:40
  • Python判断文本中消息重复次数的方法

    2022-11-12 10:00:54
  • Dreamweaver给你的网页盖个章

    2008-02-03 11:35:00
  • python中threading超线程用法实例分析

    2023-12-14 13:05:45
  • 详解python中的文件与目录操作

    2023-10-15 06:15:03
  • Oracle 数据库中创建合理的数据库索引

    2024-01-24 12:37:05
  • mysql密码中有特殊字符&在命令行下登录的操作

    2024-01-17 22:29:18
  • Python中函数参数调用方式分析

    2022-09-14 04:54:07
  • Python Map 函数详解

    2022-12-28 16:17:09
  • 基于Python创建语音识别控制系统

    2021-08-29 14:02:10
  • Python 浪漫烟花实现代码全解

    2023-11-16 01:24:56
  • Pandas+Matplotlib 箱式图异常值分析示例

    2022-09-19 08:49:39
  • 将图片保存到mysql数据库并展示在前端页面的实现代码

    2024-01-27 05:37:22
  • python机器学习实战之树回归详解

    2022-02-05 04:37:10
  • 详解Go语言中的Slice链式操作

    2024-05-22 10:29:05
  • Python3导入CSV文件的实例(跟Python2有些许的不同)

    2023-09-21 05:19:29
  • Oracle在PL/SQL中嵌入SQL语句

    2024-01-19 03:06:03
  • asp之家 网络编程 m.aspxhome.com