4.1 Python 对象
所有的Python 对像都拥有三个特性:身份,类型和值。
身份:
每一个对象都有一个唯一的身份标识自己,任何对象的身份可以使用内建函数id()来得到。这个值可以被认为是该对象的内存地址。您极少会用到这个值,也不用太关心它究竟是什么。
类型
对象的类型决定了该对象可以保存什么类型的值,可以进行什么样的操作,以及遵循什么样的规则。您可以用内建函数type()查看Python 对象的类型。因为在Python 中类型也是对象
(还记得我们提到Python 是面向对象的这句话吗?),所以type()返回的是对象而不是简单的字符串。
值
对象表示的数据
4.1.1 对象属性
某些Python 对象有属性、值或相关联的可执行代码,比如方法(method)。Python 用点(.)标记法来访问属性。属性包括相应对象的名字等等,在章节2.14 的备注中曾做过介绍。最常用
的属性是函数和方法,不过有一些Python 类型也有数据属性。含有数据属性的对象包括(但不限于):类、类实例、模块、复数和文件。
4.2 标准类型
数字(分为几个子类型,其中有三个是整型)
整型
布尔型
长整型
浮点型
复数型
字符串
列表
元组
字典
在本书中,我们把标准类型也称作“基本数据类型”,因为这些类型是Python 内建的基本数据类型,我们会在第5、6 和7 章详细介绍它们。
4.3.1 类型对象和type 类型对象
在本章我们要讨论所有的Python 类型,虽然看上去把类型本身也当成对象有点特别,我们还是要在这里提一提。你一定还记得,对象的一系列固有行为和特性(比如支持哪些运算,具
有哪些方法)必须事先定义好。从这个角度看,类型正是保存这些信息的最佳位置。描述一种类型所需要的信息不可能用一个字符串来搞定,所以类型不能是一个简单的字符串,这些信息
不能也不应该和数据保存在一起, 所以我们将类型定义成对象。下面我们来正式介绍内建函数type()。通过调用type()函数你能够得到特定对象的类型
信息:
>>> type(42)
<type 'int'>
我们仔细研究一下这个例子,请注意看 type 函数有趣的返回值。我们得到一个简洁的输出结果<type 'int'>。不过你应当意识到它并不是一个简简单单的告诉你 42 是个整数这样
的字符串。您看到的<type 'int'>实际上是一个类型对象,碰巧它输出了一个字符串来告诉你它是个int 型对象。
现在你该问自己了,那么类型对象的类型是什么?来, 我们试验一下:
>>> type(type(42))
<type 'type'>
没错,所有类型对象的类型都是type,它也是所有Python 类型的根和所有Python 标准类的默认元类(metaclass)。
核心笔记:布尔值
所有标准对象均可用于布尔测试,同类型的对象之间可以比较大小。每个对象天生具有布
尔 True 或 False 值。空对象、值为零的任何数字或者Null 对象 None 的布尔值都是False。
下列对象的布尔值是False。
None
False (布尔类型)
所有的值为零的数:
0 (整型)
(浮点型)
0L (长整型)
0.0+0.0j (复数)
"" (空字符串)
[] (空列表)
() (空元组)
{} (空字典)
值不是上面列出来的任何值的对象的布尔值都是 True,例如non-empty、 non-zero 等等。用户创建的类实例如果定义了nonzero(__nonzero__())或length(__len__())且值为0,那
么它们的布尔值就是 False
4.5 标准类型运算符
4.5.1 对象值的比较
比较运算符用来判断同类型对象是否相等,所有的内建类型均支持比较运算,比较运算返回布尔值 True 或 False。如果你正在使用的是早于 Python2.3 的版本,因为这些版本还没有
布尔类型,所以会看到比较结果为整型值 1 (代表True)或 0 (代表False)。注意,实际进行的比较运算因类型而异。换言之,数字类型根据数值的大小和符号比较,字符串按照字符序列值进行比较,等等。
>>> 2 == 2
True
>>> 2.46 <= 8.33
True
>>> 5+4j >= 2-3j
True
>>> 'abc' == 'xyz'
False
>>> 'abc' > 'xyz'
False
>>> 'abc' < 'xyz'
True
>>> [3, 'abc'] == ['abc', 3]
False
>>> [3, 'abc'] == [3, 'abc']
True
不同于很多其它语言,多个比较操作可以在同一行上进行,求值顺序为从左到右。
>>> 3 < 4 < 7 # same as ( 3 < 4 ) and ( 4 < 7 )
True
>>> 4 > 3 == 3 # same as ( 4 > 3 ) and ( 3 == 3 )
True
>>> 4 < 3 < 5 != 2 < 7
False
4.6 标准类型内建函数
除了这些运算符, 我们刚才也看到, Python 提供了一些内建函数用于这些基本对象类型:
cmp(), repr(), str(), type(), 和等同于repr()函数的单反引号(``) 运算符。
表4.4 标准类型内建函数
函数 功能
cmp(obj1, obj2) 比较 obj1 和 obj2, 根据比较结果返回整数 i:
i < 0 if obj1 < obj2
i > 0 if obj1 > obj2
i == 0 if obj1 == obj2
repr(obj) 或 `obj` 返回一个对象的字符串表示
str(obj) 返回对象适合可读性好的字符串表示
type(obj) 得到一个对象的类型,并返回相应的type 对象
数据类型 存储模型 更新模型 访问模型l
数字 Scalar 不可更改 直接访问
字符串 Scalar 不可更改 顺序访问
列表 Container 可更改 顺序访问
元组 Container 不可更改 顺序访问
字典 Container 可更改 映射访问
表4.7 以访问模型为标准的类型分类
访问模型
分类 Python 类型
直接访问 数字
顺序访问 字符串、列表、元组
映射访问 字典