Python中的对象

本文详细介绍了Python中的对象,包括对象的身份、类型和值。讨论了标准类型如整型、浮点型、字符串,以及其他内建类型如类型对象、None对象。深入探讨了内部类型如代码对象、帧对象、切片对象,以及类型相关的运算符和内建函数。文章还提到了Python对象的分类,如存储模型、更新模型和访问模型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 python对象

Python使用对象模型来存储数据,构造任何类型的值都是一个对象。
Python中所有的对象都有三个特性:身份,类型和值

身份:
每一个对象都有一个唯一的身份标识自己,即该对象的内存地址,该地址可以用内建函数id()来获得,比如:

>>> id(1)
39846232
>>> id('a')
140200776980120

类型:
对象的类型决定了该对象可以保存什么样的数据,可以用内建函数type()来获得对象的类型,type()函数返回的是一个type类型的对象,而不是一个字符串。

>>> type(1)
<type 'int'>
>>> type('a')
<type 'str'>

而type()返回的类型为type对象:

>>> type(type(1))
<type 'type'>

值:
对象表示的数据项。

对象的这三个属性,在对象创建的时候就会被赋值

2 标准类型

标准类型,也叫基本数据类型,有:

  • 整型 int
  • 布尔型 bool
  • 长整型 long
  • 浮点型 float
  • 复数型 complex
  • 字符串 string
  • 列表 list
  • 元组 tuple
  • 字典 dictionary

这些类型是python内建的基本数据类型。

3 其他内建类型

  • 类型 type
  • Null 对象 None
  • 文件
  • 集合/固定集合
  • 函数/方法
  • 模块

3.1 类型对象和type类型对象

在python中,把所有的python对象的类型都当成了对象,类型对象中保存了对象的一些固有特征,比如说支持哪些运算,具有哪些方法等。所以,类型对象不是简单的一个字符串。通过调用type()函数,可以获得对象的类型。

>>> type(42)
<type 'int'>

虽然看起来返回结果像一个字符串,但是也是对于人来说的。实际上,返回的结果就是一个type对象。

>>> type(type(42))
<type 'type'>

python中所有对象的类型都是type,它也是所有python类型的根。

3.2 None, Python 的 Null 对象

Python中有一个特殊的类型,被称作Null对象或者NoneType,它只有一个值,就是None。Null是一个类型,它只有None值。

4 内部类型

简要介绍一下内部类型,一般的程序员不会直接和这些对象打交道。

  • 代码
  • 跟踪记录
  • 切片
  • 省略
  • Xrange

4.1 代码对象

代码对象是经过编译的源代码片段,它是可以执行的对象。通过调用内建函数来得到代码对象。

>>> code = 'print "hello world"'
>>> codesample = compile(code, '' ,'exec')
>>> exec codesample
hello world

用type()函数可以看到,返回了一个code类型的对象。

>>> type(codesample)
<type 'code'>

后面在继续深入讨论代码对象,现在先简要介绍一下。

4.2 帧对象

帧对象表示 Python 的执行栈帧。帧对象包含 Python 解释器在运行时所需要知道的所有信息。它的属性包括指向上一帧的链接,正在被执行的代码对象(参见上文),本地及全局名字空间字典以及当前指令等。每次函数调用产生一个新的帧,每一个帧对象都会相应创建一个 C 栈帧。用到帧对象的一个地方是跟踪记录对象。

4.3 切片对象

扩展的切片语法允许对不同的索引切片操作,包括步进切片, 多维切片,及省略切片。多维切片语法是 sequence[start1 : end1,start2 : end2], 或使用省略号, sequence[…,start1 : end1 ]. 切片对象也可以由内建函 数 slice() 来生成 。

简单讲一下切片的语法:

>>> a = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> a[0:2] 
[0, 1]

a[0:2]的意思,就是选取列表a从第0项到第1项的值,这两个值组成一个新的列表,[0:2]并不是说从第0到第2项三个数,[0:2]是一个左闭右开区间,取不到最右边的值。

>>> b = range(10)
>>> b[ :3]
[0, 1, 2]

冒号一边不写,代表从第0项,或者从最后一项开始,例如b[:3]代表从第0项到第2项的值,而b[3:]代表从第三项到最后一项。

>>> b[3:]
[3, 4, 5, 6, 7, 8, 9]

有时候还会有第三个参数,代表步长,也就是说隔几个数读一次,比如说步长为1,代表挨着读取数组中每个数

>>> b[0:10:1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

可以简单的写为:

>>>b[::1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

步长为2的时候,代表隔一个数读取一次

>>> b[::2]
[0, 2, 4, 6, 8]

步数为3代表隔两个数读取一次

>>> b[::3]
[0, 3, 6, 9]

如果步数为负数,则代表,从后往前数,别的和步数为正的时候一样:

>>> b[::-2]
[9, 7, 5, 3, 1]

4.4 省略对象

省略对象用于扩展切片语法中,起记号作用。 这个对象在切片语法中表示省略号。类似Null 对象 None, 省略对象有一个唯一的名字 Ellipsis, 它的布尔值始终为 True.

4.5 XRange 对象

调用内建函数 xrange() 会生成一个 Xrange 对象,xrange()是内建函数 range()的兄弟版
本, 用于需要节省内存使用或 range()无法完成的超大数据集场合。在第 8 章你可以找到更多
关于 range() 和 xrange() 的使用信息。

5 标准类型运算符

5.1 对象值的比较

用 == 号来判断同类型对象是否相等。这个相等是值相等,也就是说,即使两个对象在内存中的地址不同,只要值相同,就返回true。比如:

>>> 10**3 == 1000
True

5.2 对象身份的比较

python也支持对于对象本身的比较。比如上面的例子,如果进行对象身份比较的话:

>>> 10**3 is 1000
False

有时候,如果我们敲入如下代码:

>>> 4 is 2**2
True

结果却返回了真,这个是因为,python会自动为整数对象和字符串对象创建缓存,不会销毁它们,python会自动缓存(-1,100)之间的整数,这个范围是在不断变化的,我安装的python版本已经到了[-5,265]了。所以造成了假象。

我们可以用浮点数来试一试上面的代码:

>>> 2.0 is 2.0**2
False

如果我们要缓存 2.0**2,可以使用intern()函数:

>>> x = 'a'
>>> 'aa' is x*2
False
>>> 'aa' is intern(x*2)
True

intern()已经不再推荐使用。

5.3 布尔类型

布尔逻辑运算符 and, or, not都是python关键字,这些运算符的顺序从高到低,相当于别的语言的&&,||,!=

6 标准类型内建函数

python提供了一些内建函数对于这些基本内建类型。
cmp(), repr(), str(), type(), 和等同于 repr()函数的单反引号(“) 运算符。

6.1 type ()

type()函数用来接受一个对象,并返回它的类型。它返回值是一个对象。

>>> type(4)
# int type
<type 'int'>
>>>
>>> type('Hello World!')
# string type
<type 'string'>
>>>
>>> type(type(4))
# type type
<type 'type'>

6.2 cmp()

内建函数cmp()用于比较两个对象,可以用于基本类型,也可以用于用户自定义类型。如果是用户自定义的类型,将会调用用户自定义类的特殊方法cmp()。以后将会讨论类的这些特殊方法。

如果左边参数的值比右边小,返回-1,如果左边参数比右边大,返回1,相等返回0.

>>> a, b = -4, 12
>>> cmp(a,b)
-1
>>> cmp(b,a)
1
>>> b = -4
>>> cmp(a,b)
0

7 类型工厂函数

Python从2.2以来,统一了类型和类,所以说现在所有内建类型也都是类。所以以前的类型转换函数,都变成了函数工厂。比如int(), type(), list() 等等。

下面这些大家熟悉的工厂函数在老的 Python 版里被称为内建函数:

  • int(), long(), float(), complex()
  • str(), unicode(), basestring()
  • list(), tuple()
  • type()

还有一些全新的数据类型,也增加了相应的函数工厂:

  • dict()
  • bool()
  • set(), frozenset()
  • object()
  • classmethod()
  • staticmethod()
  • super()
  • property()
  • file()

8 标准类型的分类

接下来讨论来python基本类型的几个分类标准

8.1 存储模型

按照某种类型的对象能够保存多少个对象,一个能保存单个字面对象的类型我们称它为原子或标量存储。比如字符串,数值类型。还有能保存多个对象,称为容器型。

标量/原子类型有:数值(所有的数值类型),字符串(全部是文字)
容器类型有:列表、元组、字典

8.2 更新模型

我们还可以按照另外一个标准来对标准类型分类,比如按照对象创建后,它的值是否可以更新来分类。

可以更新的,叫做可变类型,比如列表,字典

不可以更新的,叫做不可变类型,比如数字,字符串,元组

数字是不可变的,比如说,如果a = 1,再把a赋值为2,并不是说1被更新成了2,而是1被回收,新创建了一个数字对象2,把2的引用赋值给a。

8.3 访问模型

现在我们可以按照访问存储数据的方式来对数据类型进行分类。在访问模型中共有三种访问方式:直接存取,顺序存取,和映射。

直接存取,指的是对非容器类型可以直接访问。所有数值类型都归到这一类

顺序存取,指的是可以根据索引顺序来访问数据。

映射存取,指的是可以通过一个唯一的key来存取,它容纳的是哈希键-值对的集合。

  • 直接访问 数字
  • 顺序访问 字符串、列表、元组
  • 映射访问 字典

参考资料:Python核心编程 第二版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值