Python学习笔记_Python对象


Python学习笔记_Python对象 Python对象 标准类型 其他内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比较 对象身份比较 布尔类型 标准类型的内建函数 typeObj cmpobj1 obj2 strobj reprobj typeobj isinstanceobj 标准类型的分类 存储模型 更新模型 访问模型 不支持的类型

Python学习笔记_Python对象

首先来理解一个通俗的含义,什么是对象?其实对象无论在什么语言里面,比如C++,Python里面都是指一块有类型的内存,对象里面存放着相应的数据

Python对象

所有的Python对象都有三个特性:身份类型
- 身份:每一个对象都有唯一的一个身份ID来标识自己,就像该对象在内存中的存储地址一样,是唯一的,不可共用的。任何对象的身份标识符都可以用内建函数id()来得到

x=1
print id(x)
#运行结果:163449008
类型:因为Python是动态类型的,所以一个对象里面就应该保存该对象的类型来决定该对象而已进行一些什么样的操作。我们可以通过内建函数type()来得到对象的类型
number1 = 1
str1 = 'Hello World'
print type(number1)
print type(str1) 

#运行结果
#
#
:对象表示的数据项,我们在内存里面无差别的存储数据,假如我们在内存里面存储的是1000001,如果是str类型,那么就解释为'A',如果是整形,就解释为65

对象属性: 某些对象有属性,值或者相关联的可执行代码,最常见的属性是函数和方法

标准类型

数字 Integer 整形 Boolean 布尔型 Long integer 长整形 Floating point real number 浮点型 Complex number 复数型 String 字符串 List 列表 Tuple 元组 Dictionarry 字典

其他内建类型

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

类型对象和type类型对象

之前提到过,对象通过类型来判断自己可以执行那些操作,那么类型就是用来存储这些操作最佳场所,所以相对于字符串来说,用一个对象来描述一个类型更为适合。

type()内建函数返回一个type对象,只不过这个对象被以字符串的形式展现出来

print type(10)
print type(type(10))

#运行结果:
#
#

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

Python的Null对象——None

None只有一个值,它不支持任何运算,没有任何内建方法。
每个对象天生具有True或者False值。
下面对象的布尔值是False:

None False 所有值为0的数 0 0.0 0L 0.0+0.0j “” [] () {}
除了上面的值,其他值都是True

标准类型操作符

对象值的比较

对象值的比较会直接返回一个Bool对象,各种类型的对象的比较方法也不同。,数字类型的根据数值的大小和符号比较,字符串按照字符序列进行比较等等

对象身份比较

在python里面,一般都是首先在内存中创建一个对象,然后再将这个对象的引用赋值给变量,通过引用对对象进行操作。

x = 3.14 # 创建一个3.14浮点型对象,并将引用赋值给变量x

在许多情况下,一个对象的引用会传给对个变量,为了检测两个变量是否同时指向同一个变量,我们可以用内建函数id()来比较两个变量指向对象的id是否相等,或者使用is或者is not来比较两个变量是否指向同一个对象

举个栗子:

x = 3.14
y = x
print id(x) == id(y)
print x is y # 和 id(x) == id(y) 一样
print x is not y # 和 id(x) != id(y) 一样

运行结果:
True
True
False

举个栗子:

x = 3.14
y = 1.0 + 2.14
print x is y # 虽然数值相同,但是并不指向同一个对象

运行结果:
False

布尔类型

当多个布尔条件需要通手机进行判断时,Python为我们提供了下面几个语句

操作符 功能
and 逻辑与
or 逻辑或
not 逻辑非

标准类型的内建函数

除了操作符,Python还提供了一些内建函数用于这些基本信息:

函数 功能
cmp(obj1 , obj2) 比较两个对象是否相等
repr(obj) 返回一个对象的字符串表示
str(obj) 以可读性良好的为目的返回一个对象的字符串表示
type(obj) 返回对象的类型,返回的类型是一个类型对象

type(Obj)

type()内建函数是用来返回一个对象的类型的

print type(1)
print type('Hello World')

运行结果:

cmp(obj1 , obj2)

cmp(obj1 , obj2)是用来比较两个对象的

返回结果 比较情形
正整数 obj1 > obj2
0 obj1 = obj2
负整数 obj1 < obj2

上面比较返回的数值可以理解为 obj1 - obj2 返回的结果

举个栗子:

x, y = 1, 2
print cmp(x, y)
# 运行结果: -1
str1, str2 = 'xyz', 'abc'
print cmp(str1, str2)
# 运行结果: 1

str(obj) & repr(obj)

上面的两个内建函数str(obj)repr(obj)都是返回一个对象的字符串,但是这两个内建函数又有所不同:

str(obj):是用来返回一个可读性好的字符串,面向的用户是程序员 repr(obj):是用来返回一个Python虚拟机看得懂的字符串,面向的用户是Python虚拟机repr(obj)返回的字符串可以通过eval(str)重新求值!即这个式子是成立obj == eval(repe(obj))

总的来说,就是repr(obj)是对Python比较友好str(obj)是对用户比较友好 , 但是许多情况下strrepr的输出都是一样的

print str(1)
print repr(1)
#运行结果:
#1
#1

type(obj) & isinstance(obj)

type(obj)可以返回任意Python对象的类型,而不仅局限于标准类型
举个栗子:

对于标准类型

print type('')
#运行结果: 
print type({})
#运行结果: 

对于自定义类型

class Foo:
    pass
foo = Foo()

class Bar(object):
    pass
bar = Bar()

print type(Foo)
#运行结果 : 
print type(foo)
#运行结果 : 
print type(Bar)
#运行结果 : 
print type(bar)
#运行结果 : 

如果现在我们需要确定一个对象的类型,我们可以采用下面的语句进行判断:

#方式1
if type(num) == type(0):...
#方式2
import types
if type(num) == types.IntType:...
#方式3
if type(num) is types.IntType:... # 因为在运行时只有一个对象来表示整形类型
#方式4
from types import IntType
if type(num) is IntType:...
#方式5
if isinstance(num , int):...

标准类型的分类

有三种不同的模型可以帮助我们对基本类型进行分类:

存储模型 更新模型 访问模型

存储模型

存储模型里面我们按照类型的对象可以保存多找个对象分为两类:

标量存储类型:只能保存单个字面对象的类型 容器存储类型:可以容纳多个对象的类型
分类 python类型
标量存类型 数值(所有数值类型) ,字符串(全部是文字,因为python没有字符类型)
容器类型 列表 , 元组 , 字典

更新模型

python里面类型分为可以更改是不可以更改两种类型,运行更改的对象允许他们的值发生变化,而不可更改的对象则不允许他们的值进行更改

分类 Python类型
可变类型 列表,字典
不可变类型 数字,字符串 ,元组

什么?数字和字符串是不可以更改的?那下面这个更改又是怎么回事?

str1 = 'Hello World'
str1 = 'Hello Moto'

不错,上面的变量的值的确发生了改变,但是变量不代表对象,第一次赋值是将'Hello World'的引用赋值给str1,而第二只赋值语句则是将'Hello Moto'的引用赋值给str1,两个字符串对象'Hello World''Hello Moto'的值是没有发生改变的!

访问模型

在访问模型中共有三种访问方式:直接存取,顺序映射

直接访问:对非容器对象都可以直接访问 序列访问:容器内的元素可以从0开始的索引顺序访问 映射访问: 通过一个唯一的键来访问
分类 Python类型
直接访问 数字
顺序访问 字符串, 元组, 列表
映射访问 字典

不支持的类型

Python里面有一些常见但是不支持的类型:

char和byte 指针 int, short, long 单精度浮点数

 

评论关闭