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)
#执行结果
#<type 'int'>
#<type 'str'>
值
:对象表示的数据项,我们在内存里面无区别的存储数据,假如我们在内存里面存储的是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 'int'>
#<type 'type'>
全部类型对象的类型都是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)
是对用户比較友好 , 可是很多情况下str
和repr
的输出都是一样的
print str(1)
print repr(1)
#执行结果:
#1
#1
type(obj) & isinstance(obj)
type(obj)
能够返回随意Python
对象的类型,而不仅局限于标准类型
举个栗子:
对于标准类型
print type('')
#执行结果: <type 'str'>
print type({})
#执行结果: <type 'dict'>
对于自己定义类型
class Foo:
pass
foo = Foo()
class Bar(object):
pass
bar = Bar()
print type(Foo)
#执行结果 : <type 'classobj'>
print type(foo)
#执行结果 : <type 'instance'>
print type(Bar)
#执行结果 : <type 'type'>
print type(bar)
#执行结果 : <type '__main__.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
- 单精度浮点数