之前关于python的知识比较零散,这一个系列的随笔将python重新学习整理一遍。学习书籍《Python核心编程》第二版。
Python对象基础
python并不是一个单纯面向对象的语言,他融合了其他语言,如函数式语言的特性。但是python的面向对象也是很强大的。
所有的Python对象都具有三个属性:身份(id),类型(type),值(value)。身份属性可以通过内建函数id()获得,可以看做是对象的内存地址,每个对象的id值都是唯一的,所以可以用id来判断两个对象是否是同一块内存的不同引用;类型属性可以通过内建函数type()来获得,由于python的面向对象特性,类型本身也是一个对象,所以type()返回的不仅仅是一个字符串,而是一个对象,所以类型也有类型,所有的类型的类型为type。值属性则是对象表示的具体数据。由于这三个属性是每个对象都具有的,当一个对象被创建时,这三个属性就被赋值,并且除了值之外都不能被改变,所以python是一门强类型语言。对象除了三个基本属性之外,还有其他的属性、值、可执行代码等。
python的类型包括标准类型,如Integer、Boolean、String、Tuple,以及一些特殊的内建类型如type、Null、文件、集合、函数、模块、类等,还有一些内部类型,如代码、帧、跟踪记录、切片、省略和Xrange。
代码的身份:由于python通过引用可以将一个对象赋值到另一个变量,原始对象的引用计数加一次,当某一个引用试图改变该对象的值时,若该对象是不可更新类型,实际工作是新建一个新的对象,并且将该变量引用该新对象,若该对象是可更新类型,则更新该对象的内容:
如上idle执行结果可以看出,在python中,一些小的整形会被缓存,当其他的变量值等于该整形值时,会创建一个该整形对象的引用,而浮点数和大的整形并没有缓存,当一个对象的引用计数为0时,python会再适当的时候对其进行垃圾回收。
通过内建函数 is 、 is not来判断两个变量是否是同一个对象的不同引用。
Python的内建函数和类型
evel()函数,python的evel()函数可以对传入的字符串求值,repr()函数和str()函数可以将一个对象转换为字符串表示,但是有所区别,str()函数对用户比较友好,可以转换为适合打印的字符串,repr()函数转换的字符串对python比较友好,比较合适用于运算求值。(具体的区别还没有搞清楚,相信之后一定会涉及到)。
type()函数和isinstance()函数可以判断一个对象的类型,type()函数传入一个对象并且返回其类型,isinstance()则传入一个对象和一个类型的元组,并且判断该对象的类型是否在元组中,返回判断结果的布尔值。
Python在2.2之后统一了类型和类,所有的类型都是一个类,并且所有内建类型的转换函数都是工厂函数,也是对面向对象的一个加强。当执行int()、tpye()、list()时,实际上是创建了相应的类型的实例。所有的内建类型为了这次统一,都添加了相应的内建函数,当执行int()时,实际上的工作其实是调用了int类中的__init__()方法,而在强制将一个字符串’123’转换为整形时,实际上是在string类中实现__int__()的方法。工厂函数之所以可以直接调用,应该是在Class类中添加了__call__方法,使得每一个类都是可调用对象,通过给类添加该方法,同样可以实现将对象可调用化。
Python标准类型的分类
对于python中的标准类型,可以按照存储模型、更新模型、访问模型细分:
存储模型:
标量/原子类型 数值、字符串
容器类型 列表 、元组、字典
更新模型:
可变类型 列表、字典
不可变类型 数字、 字符串、元组
访问模型
直接访问 数字
顺序访问 字符串、列表、元组
映射访问 字典
同时,在python中,没有char、byte、指针等类型,python中的整形和长整形会自动转换(python2.3开始),而长整形的大小取决于运行机器的虚拟内存大小。