Python类型综述

作者:最西瓜 来源:《Core Python Programming, Second Edition》CH4. Python Objects

Python中所有值都是对象,对象有三个属性:id、类型和值。id类似于C语言中的地址,用内建函数(BIF) id()可以获取一个对象的id,你会发现b = a = 1中a b的id是一样的。用type()可以得到对象的类型对象,类型对象所属的类就是type类,跟Java中的Class对象类似。

Python的标准数据类型包括:3个整型(int、bool、long)以及float、complex、string、list、tuple、dictionary。从字符串开始的类型在很多别的语言中不算是基本类型,而是用类库的方式实现。在PHP、Lua、Python、Javascript这些脚本语言中则为了更加方便好用而实现成语言级别。另外Python中还有其它内建类型如:Type、空对象(None)、文件、Set、函数、模块和类。

所有的对象的类型都是一个type对象,type对象本身的类型也是一个type对象。在Python2.2之前,class和type是不一样的,type特值的是内置的用C定义的类型,class则是用户在Python用class声明定义的类,class不能继承type。从Python2.2开始,class和type得到了统一,class可以继承type。具体可参考Unifying types and classes in Python 2.2 在Python2.x中还支持新式类和旧式类,简单将新式类就是继承自object的类,更详细的内容会在专门将对象时提及。Python中还有一个特殊的值None,相当于C语言中的NULL宏,它的类型是NoneType,专门用来表示函数返回空值。

布尔值 以下值会被认为是False:None、False、数字零(整数、浮点数、长整数、复数)、空字符串、空列表([])、空元组(())、空字典({})。任何其它对象值都会认为是True。如果用户定义的类中特殊方法__nonzero____len__返回0,被认为是False。综上,只有被认为是空的对象会被取值为False。不要忘了布尔值是一种特殊类型的整型。

内部类型 内部类型是应用程序员很少直接使用的,包括:Code、Frame、Traceback、Slice、Ellipsis、Xrange。

Code对象是被compile()函数编译后的Python字节码,代码对象能够被execeval()执行,代码对象本身不包含执行环境的任何信息,它们同时也是function的一个属性。

Frame对象指的是Python的栈帧,包含前一个栈帧的指针、所执行的代码信息、本地和全局名称表、当前执行指令。所有函数调用都会生成一个新的Frame对象,一个Frame对象对应一个C栈帧。

Traceback对象用来保存异常的堆栈信息,是在异常发生时创建的,如果异常能够捕捉,捕捉代码将能够访问Traceback对象。

Slice对象在Python中使用切片语法时创建,可以由如下语法创建:sequence[starting_index : ending_index : stride] sequence[start1 : end1, start2 : end2] sequence[…, start1 : end1] 同时可以用slice()创建,还可以由sequence[starting_index : ending_index : stride]形式创建。以下形式也是支持的:

1
2
3
4
5
foostr = 'abcde'
foostr[::-1]
foostr[::-2]
foolist = [123, 'xba', 342.23, 'abc']
foolist[::-1]

省略索引表示从头至尾,而stride等于-1表示反转整个列表;

Ellipsis对象就是省略号切片形式中的省略号对象,省略号对象跟None对象一样只有一个值,并且被认为是True。省略号常用于循环列表如:a=[1, 2];a.append(a)

XRange对象由xrange()函数创建类似于range()但更省内存空间。

在types模块中可以找到所有的内置类型描述和引用。

对象比较 Python对所有的内置类型执行值比较,不同的类型具有不同的比较方式。数字类型就比较数字大小,字符串类型按照字典进行比较,列表按照长度比较,并且所有的数字小于字符串。这些操作符包括:> < <= >= == !=。除此之外,Python还支持对象唯一性比较操作符isis nota is b操作符比较等价于id(a) == id(b)

需要注意的是Python会对-1到100的整数对象进行缓存,所以这个集合内的数的id是一样的,对于浮点数Python没有这样的行为。但我们不应该依赖于这种内部实现特性,它随时会变。

Python有内置函数cmp(obj1, obj2)来进行对象比较,若obj1>obj2则返回大于0的整数,相等则返回0,小于则返回小于0的整数。对于用户定义的类型,将最终调用类的__cmp__()方法。

内置函数isinstance()可以判断一个对象是否是一个类型的对象,如:isinstance(num, (int, long, float, complex))

所有的操作符在operator模块中都有对应的函数。

工厂方法 工厂方法用来方便的构建内置对象,以下是常用的工厂方法:int() long() float() complex() str() unicode() basestring() list() tuple() type() dict() bool() set() frozenset() object() classmethod() staticmethod() super() property() file()