Python核心编程----Python对象

本文深入探讨了Python中的对象,包括标准类型如整型、浮点型、字符串、列表、元组和字典,以及其他内置类型如None对象、文件、集合和函数。详细阐述了类型对象、None作为Python的Null对象,以及内部类型如代码对象、帧对象和切片对象。还讨论了对象的比较、布尔类型、内建函数如type()、cmp()以及对象值和身份的比较。最后,介绍了类型工厂函数和标准类型的存储、更新及访问模型。

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

一、Python对象

所有Python对象都拥有三个特性:
身份:每个对象都有一个唯一的身份标识自己,任何对象的身份可以通过id() 来得到,这个值可以被认为是该对象的内存地址。
类型:对象的类型决定了该对象可以保存什么类型的值。可以使用type()  来查看对象的类型。
值    :对象表示的数据项。

对象属性
       某些Python对象有属性、值或相关联的可执行代码,比如方法。Python使用句点标记法来访问属性。最常用的属性是函数和方法,不过有一些Python类型也有数据属性。


二、标准类型

也称作“基本数据类型”

  • 数字(分子类型,其中三个是整型)
  • Integer  整型
  • Boolean  布尔型
  • Long integer  长整型
  • Floating point real number 浮点型
  • Complex number  复数型
  • String  字符串
  • List  列表
  • Tuple  元组
  • Dictinary  字典


三、其他内建类型

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

3.1 类型对象和type类型对象

       类型是保存对象的一些固有行为和特性。
>>> type(10)
<type 'int'>

>>> type(type(10))
<type 'type'>

        所有类型对象的类都是type, 它也是所有Python类型的根和所有Python标准类的默认元类。

3.2  None  —— Python的Null对象

             特殊类型Null对象,它只有一个值,就是None。不支持任何运算也没有内建方法。None没有什么有用的属性,它的布尔值总是False。

 布尔值:
空对象、值为零的任何数字或Null对象None的布尔值都是False。比如:0  0.0   0L   ""   []   ()  {}


四、内部类型

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

4.1  代码对象

        代码对象是编译过的Python源代码片段,它是可执行对象。可以通过内建函数compile() 得到代码对象。代码对象可被exec命令或 eval() 内建函数来执行。
        代码对象本身不包含任何执行环境信息,它是用户自定义函数的核心,在被执行时动态获得上下文。事实上代码对象是函数的一个属性,除此之外,函数还有其他属性:函数名、文档字符串、默认参数、全局命名空间等。

4.2   帧对象

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

4.3  跟踪记录对象

         当代码出错,Python会引发一个异常。若异常未被捕获和处理,解释器就会推出脚本,并打印诊断信息。当异常发生时,一个包含针对异常的栈跟踪信息的跟踪记录对象被创建。若异常有自己的处理程序,处理程序就会访问这个跟踪记录对象。

4.4   切片对象

        当使用Python扩展的切片语法时,就会创建切片对象。切片对象也可以由内建函数 slice() 来生成。
        
>>> str = 'abcde'

>>> str[::-1]
'edcba'

>>> str[::-2]
'eca'

>>> l = [123, 456, 'asdf', 'qwer']

>>> l[::-1]
['qwer', 'asdf', 456, 123]

4.5  省略对象

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

4.6   Xrange对象

        调用内建函数xrange()  会生成一个Xrange对象,用于需要节省内存使用或range()  无法完成的超大数据集场合。



五、标准类型操作符

5.1  对象值的比较

          比较操作符用来判断同类型对象是否相等,所有的内建类型均支持比较运算,比较运算返回值是布尔值。

5.2   对象身份比较

         Python提供了 is  和  is not  操作符来测试两个变量是否指向同一个对象。
         
>>> l is str
False

>>> k = l

>>> l is k
True

>>> id(l)
139848006103408

>>> id(k)
139848006103408

Python中整型和字符串对象是不可变对象。
>>> a = 1

>>> id(a)
9105752

>>> b = 1

>>> id(b)
9105752

>>> c = 1.0

>>> id(c)
13506488

>>> d = 1.0

>>> id(d)
11071344

Python仅缓存简单整型,缓存的整型范围是(-5, 256) Python 2.7.11

5.3  布尔类型

          布尔逻辑操作符 and  or   not 都是Python关键字。not  拥有最高优先级,只比所有比较操作符低一级,and 低于 not  , or 低于 and。


六、标准类型内建函数

6.1 type()

        type() 接受一个对象作为参数,并返回它的类型。它的返回值是一个类型对象。
>>> type(10)
<type 'int'>

>>> type(type(10))
<type 'type'>


6.2  cmp()

        cmp()用于比较两个对象。如果obj1 小于 obj2, 则返回一个负整型,反之则返回一个正整型, 若相等则返回0.
>>> a, b = 4, 12

>>> cmp(a,b)
-1

>>> cmp(b,a)
1

>>> b = 4

>>> cmp(a,b)
0

>>> a, b = 'abc', 'xyz'

>>> cmp(a,b)
-1

>>> cmp(b,a)
1

>>> b = 'abc'

>>> cmp(a,b)
0

6.3  str()和 repr()(以及 ` `  `操作符)

       str() 和 repr()或 反引号操作符可以方便地以字符串的方式获取对象的内容、类型、数值属性等信息。str()获得的字符串可读性好,而repr()获得的字符串通常可用于重新获得该对象,例如 obj == eval(repr(obj)) 这个等式是成立的。
>>> str(1)
'1'

>>> str(2e10)
'20000000000.0'

>>> repr([1, 2, 3, 4, 5])
'[1, 2, 3, 4, 5]'

>>> `[1, 2, 3, 4, 5]`
'[1, 2, 3, 4, 5]'

并不是所有repr()返回的字符串能够用 eval() 内建函数得到原来的对象。


6.4  type() 和 isinstance()

        
#!/usr/bin/python
# -*- coding:utf-8 -*-

def displayNumType(num):
    print num, 'is',
    if isinstance(num, (int, long, float, complex)):
        print 'a number of type:', type(num).__name__
    else:
        print 'not a number at all!!!'


displayNumType(-69)
displayNumType(99999999999999999999)
displayNumType(98.6)
displayNumType(-5.2+1.8j)
displayNumType('xxx')

输出
-69 is a number of type: int
99999999999999999999 is a number of type: long
98.6 is a number of type: float
(-5.2+1.8j) is a number of type: complex
xxx is not a number at all!!!

例子进阶:
#!/usr/bin/python
# -*- coding:utf-8 -*-


def displayNumType(num):
    print num, 'is',
    if type(num) == type(0):
        print 'an integer'
    elif type(num) == type(0L):
        print 'a long'
    elif type(num) == type(0.0):
        print 'a float'
    elif type(num) == type(0+0j):
        print 'a complex number'
    else:
        print 'not a number at all!!!'


displayNumType(-69)
displayNumType(99999999999999999999)
displayNumType(98.6)
displayNumType(-5.2+1.8j)
displayNumType('xxx')

这里我们看到代码中,调用了两次type(). 利用types模块,我们可以将检测到的类型与一个已知类型进行比较,从而减少函数调用次数,提高代码的性能。
>>> import types

>>> types.IntType
<type 'int'>


对象值比较VS对象身份比较


        在运行事情,只有一个类型对象来表示整型类型,也就是说,type(0),type(10),都是同一个对象<type 'int'>。既然他们是同一个对象,我们就可以用对象身份比较来替代对象值比较。如果对象是不同的,那意味着原来的变量一定是不同类型的。我们就没必要去检查(值)了。        
>>> if type(num) is types.IntType 


减少查询次数

    
>>> if type(num) is IntType 


isinstance()是个布尔函数,接受一个或多个对象作为参数,由于类型和类现在都是一回事,int 现在既是一个类型,又是一个类。我们可以使用isinstance()函数来让if 语句更方便。

if    isinstance(num,  int)....

所以脚本最终使用了 isinstance()函数,而且接受一个类型对象的元组作为参数,这样我们就不必写大量的 if-elif-else了。


七、类型工厂函数

                 Python2.2 统一了类型和类,原来的所谓内建转换函数 int()  type()   list() 等现在成了工厂函数,实际上它们是类,调用时,实际上是生成了该类型的一个实例。

八、标准类型的分类

8.1  存储模型

            根据这种类型的对象能保存多少个对象,将其分为原子(标量)存储 和 容器存储。所有的Python容器对象都能容纳不同类型的对象。

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


8.2  更新模型

            
按更新模型的类型分类
分类Python类型
可变类型列表,字典
不可变类型数字、字符串、元组

>>> x = 'a'

>>> id(x)
140622681425080

>>> x = 'b'

>>> id(x)
140622681425120

>>> i = 1

>>> id(i)
38740312

>>> i += 1

>>> id(i)
38740288

>>> l = [1, 2, 3, 4]

>>> id(l)
140622476628624

>>> l[0] = 10

>>> id(l)
140622476628624

8.3  访问模型

            根据访问我们存储的数据的方式对数据类型进行分类。访问模型中有三种访问方式:直接存取、顺序和映射。
            对于非容器类型可以直接访问,所有的数值类型归到这类里。
            序列类型是指容器内的元素从0开始的索引顺序访问。字符串、列表和元组归到这类里。
            映射类型类似于序列类型。但是它的索引并不适用顺序的数字偏移量取值,它的元素无序存放,通过唯一的键来访问。
访问模型来分类
分类Python类型
直接访问数字
顺序访问字符串,列表,元组
映射访问字典



标准类型分类
数据类型存储模型更新模型访问模型
数字标量不可更改直接访问
字符串标量不可更改顺序访问
列表容器可更改顺序访问
元组容器不可更改顺序访问
字典容器可更改映射访问















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值