PHP2Python--Python对象
时间:2010-10-08 来源:秋水伊扬
写在前面的话: http://www.meegoq.com/home-space-uid-18-do-blog-id-34.html
上篇: PHP2Python 基本语法精要
Python对象三个特性:
身份
可以用内建函数 id() 得到,可以认为是该对象的地址
类型
类型决定该对象可以进行什么样的操作,遵循什么样的规则,可以使用内建的type()查看Python对象类型,type()返回的是对象而不是字符串
值
对象表示的数据项
除了值,对于同一个对象来说,其他两个特性都是只读的.
对象的值如果不可以更改,就是只读的.值是否可以被更改称为对象的可改变性(mutability)
Python对象属性:
Python有属性,值或相关联的执行代码. Python用点 ( . ) 访问属性.
含有数据属性的对象包括(但不限于):类,类实例,模块,复数和文件
标准类型:
类型对象和type类型对象
类型本身也被当成对象
- >>>type(42)
- <type 'int'>
- >>>type(type(42))
- <type 'type'>
None, Python的Null对象
布尔值
每个对象天生具有布尔 True 或 False 值
空对象,值为零的任何数字或者Null对象None的布尔值都是False
以下值均为False,除了下面以外的任何值都是True
None
False (布尔类型)
所有的值为零的数:
0 (整型)
(浮点型)
0L (长整型)
0.0+0.0j (复数)
"" (空字符串)
[] (空列表)
() (空元组)
{} (空字典)
如果用户创建的类实例如果定义了 nonzero(__nonzero__()) 或 length(__len__()) 且值为0,那么它们的布尔值就是False
复数
列表
元组
字典
类型
文件
集合/固定集合
模块
内部类型:
代码对象
代码对象是编译过的Python 源代码片段,它是可执行对象。通过调用内建函数compile()可以得到代码对象。代码对象可以被 exec 命令或 eval()内建函数来执行。
代码对象本身不包含任何执行环境信息, 它是用户自定义函数的核心, 在被执行时动态获得上下文。(事实上代码对象是函数的一个属性)一个函数除了有代码对象属性以外,还有一些其它函数必须的属性,包括函数名,文档字符串,默认参数,及全局命名空间等等。
帧对象
帧对象表示 Python 的执行栈帧。帧对象包含Python 解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个C 栈帧。用到帧对象的一个地方是跟踪记录对象
跟踪记录对象
当你的代码出错时, Python 就会引发一个异常。如果异常未被捕获和处理, 解释器就会退出脚本运行,显示类似下面的诊断信息:
- Traceback (innermost last):
- File "<stdin>", line N?, in ???
- ErrorName: error reason
当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。如果一个异常有自己的处理程序,处理程序就可以访问这个跟踪记录对象。
切片对象
当使用Python 扩展的切片语法时,就会创建切片对象。扩展的切片语法允许对不同的索引切片操作,包括步进切片, 多维切片,及省略切片。多维切片语法是 sequence[start1 : end1,start2 : end2], 或使用省略号, sequence[...,start1 : end1 ]. 切片对象也可以由内建函数 slice()来生成。步进切片允许利用第三个切片元素进行步进切片,它的语法为sequence[起始索引 : 结束索引 : 步进值]。Python 很早就支持扩展步进切片语法了,但直到 Python2.3 以前都必须依靠 C API 或 Jython 才能工作。 下面是几个步进切片的例子:
- >>> foostr = 'abcde'
- >>> foostr[::-1]
- 'edcba'
- >>> foostr[::-2]
- 'eca'
- >>> foolist = [123, 'xba', 342.23, 'abc']
- >>> foolist[::-1]
- ['abc', 342.23, 'xba', 123]
省略对象
省略对象用于扩展切片语法中,起记号作用。 这个对象在切片语法中表示省略号。类似Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.
XRange 对象
调用内建函数 xrange() 会生成一个Xrange 对象,xrange()是内建函数 range()的兄弟版本, 用于需要节省内存使用或 range()无法完成的超大数据集场合
比较运算:
不同于很多其它语言,多个比较操作可以在同一行上进行,求值顺序为从左到右。
- >>> 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
比较的是对象的数值而非对象本身
目前使用中的 <> 与 != 同义,以后可能会不支持 <>
对象身份比较
is ,is not
类似于 C 中的引用比较,由引用的的对象是否相同,决定比较结果
a is b 赞同于 id(a) == id(b)
- >>>a = 3.5
- >>>b = 1.5 + 2
- >>>a == b
- True
- >>>a is b
- False
Python中缓存整数和字符串.因为python认为小整数会被经常用到
- >>> a = 1
- >>> id(a)
- 8402824
- >>> b = 1
- >>> id(b)
- 8402824 #与a相同的id
- >>>
- >>> c = 1.0
- >>> id(c)
- 8651220
- >>> d = 1.0
- >>> id(d) #与c不同的id
- 8651204
Python仅缓存简单整数,目前是(-1,100),未来可以会改变,编程时不要使用这个特性
Python2.3以后,如果预定义缓存字符串表之外的字符串,如果不丗有任何引用指向它,那这个字符串就不会被缓存.
布尔类型
and, or , not 都是python关键字. or 优先级最高,其次是and 和 or
标准类型内建函数
cmp(obj1, obj2) 比较 obj1 和 obj2, 根据比较结果返回整数 i:
i < 0 if obj1 < obj2
i > 0 if obj1 > obj2
i == 0 if obj1 == obj2
str(obj) 返回对象适合可读性好的字符串表示
repr(obj) 或 `obj` 返回一个对象的字符串表示, 通常用于再次生成该对象. 通常情况下,obj == eval(repr(obj))
isinstance()接受一个数值参数,使用内建函数type()来确认数值的类型
isinstance(1,int)
isinstance(1,(int, long, float, complex))
引用 types 模块,提高类型比较效率
- >>>import types
- >>>if type(num) == types.IntType ...
可以在比较对象值之前,先行比较对象的类型.不同的类型意味着值不一样
- >>>from types import IntType #可以减少查询的次数
类型工厂函数:
工厂函数,实质上是类.当调用它们时,都 生成了该类型的一个实例.
int(),long(),float(),complex()
str(),unicode(),basestring()
list(),tuple()
type()
dict()
bool()
set(), frozenset()
object()
classmethod()
staticmethod()
super()
property()
file()
type(obj) 得到一个对象的类型,并返回相应的type 对象
标准类型的分类
存储模型
一个能保存单个字面对象的类型我们称它为原子或标量存储,那些可容纳多个对象的类型,我们称之为容器存储。
分类 Python 类型
标量/原子类型 数值(所有的数值类型),字符串(全部是文字)
容器类型 列表、元组、字典
更新模型
可变对象允许他们的值被更新,而不可变对象则不允许他们的值被更改
分类 Python 类型
可变类型 列表, 字典
不可变类型 数字、字符串、元组
访问模型
分类 Python 类型
直接访问 数字
顺序访问 字符串、列表、元组
映射访问 字典
不支持的类型
Python 没有 char 或 byte 类型来保存单一字符或8 比特整数。你可以使用长度为1 的字符串表示字符或8 比特整数。
Python 替你管理内存,因此没有必要访问指针。
Python 的普通整数相当于标准整数类型,不需要类似C 语言中的 int,short, long 这三种整数类型。
Python 的浮点类型实际上是C 语言的双精度浮点类型。Python 认为同时支持两种浮点类型的好处与支持两种浮点类型带来的开销不成比例,所以Python 决定不支持单精度浮点数.
Python 还有一种十进制浮点数类型 Decimal, 不过你必须导入decimal 模块才可以使用它。浮点数总是不精确的。Decimals 则拥有任意的精度。在处理钱这类确定的值时,Decimal 类型就很有用。 在处理重量,长度或其它度量单位的场合, float 足够用了。
转载请注明来自: http://www.meegoq.com/thread-581-1-1.html