python中的對象(三)


一、python對象

  python使用對象模型來存儲數據。構造任何類型的值都是一個對象。

  所有python對象都擁有三個特性:身份、類型、值

    身份:每個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數 id() 來得到。

    類型:對象的類型決定了該對象可以保存什么類型的值,可以進行什么樣的操作,以及遵循什么樣的規則。可以使用 type() 函數查看python對象的類型。type()返回的是對象而不是簡單的字符串。

    值:對象表示的數據。

>>> value = "abc"
>>> id(value)   #身份
39102784L
>>> type(value) #類型
<type 'str'>
>>> value  #值
'abc'
>>> 

二、python類型

  (1).標准類型

    1.數字(分為幾個字類型,其中三個是整型)

    2.Integer  整型

    3.Boolean  布爾型

    4.Long integer  長整型

    5.Floating point real number  浮點型

    6.Complex number 復數型

    7.String 字符串

    8.List 列表

    9.Tuple 元祖

    10.Dictionary 字典

  (2).其他內建類型

    類型、Null對象(None)、文件、集合/固定集合、函數/方法、模塊、類

    通過type()函數可以查看對象的類型

>>> type(1)
<type 'int'>  #它是一個類型對象
>>> type("123")
<type 'str'>  #它是一個類型對象
>>> type([1,2,"3"])
<type 'list'>  #它是一個類型對象
>>> type((1,2,"3"))
<type 'tuple'>  #它是一個類型對象
>>> 

    類型對象的類型是type,它是所有python類型的根和所有python標准類的默認元類

>>> type(type(1))
<type 'type'>
>>> type(type("123"))
<type 'type'>
>>> 

  注意:所有標准對象均可用於布爾測試,同類型的對象之間可以比較大小。每個對象天生具有布爾True或False值。值為零的任何數字或者Null對象None的布爾值都是False。

  下列對象的布爾值是False:None、False、所有的值為零的數、0(整數)、0.0(浮點數)、0L(長整數)、0.0+0.0j(復數)、“”(空字符串)、[](空列表)、()(空元祖)、{}(空字典)。值不是上面列出來的任何值的對象的布爾值都是True。

三、對象的比較

  (1).對象值值的比較

貼代碼

  (2).對象身份的比較(重點理解哦

    對象可以被賦值到另一個變量(通過引用)。因為每個變量都指向同一個(共享的)數據對象,只要任何一個引用發生改變,該對象的其他引用也會隨之改變。

    例子1:foo1和foo2指向相同的對象

      foo1 = foo2 = 4.3

      這個語句的實際意思是一個值為4.3的數字對象被創建,然后這個對象的引用被賦值給foo1和foo2,結果就是foo1和foo2指向同一個對象

                                               

    例子2:foo1和foo2指向相同的對象

      foo1 = 4.3

      foo2 = foo1

      這個例子非常類似上一個,一個值為 4.3 的數值對象被創建,然后賦給一個變量,當執行 foo2 = foo1 時, foo2 被指向 foo1 所指向的同一個對象, 這是因為 Python 通過傳遞引用來 處理對象。foo2 就成為原始值 4.3 的一個新的引用。這樣 foo1 和 foo2 就都指向了同一個對 象。示意圖也上圖一樣。

    例子3:foo1和foo2指向不相同的對象

      foo1 = 4.3

      foo2 = 1.3 + 3

      這個例子有所不同。首先一個數字對象被創建,然后賦值給 foo1. 然后第二個數值對象被 創建並賦值給 foo2. 盡管兩個對象保存的是同樣大小的值,但事實上系統中保存的都是兩個獨立的對象,其中foo1是第一個對象的引用, foo2則是第二個對象的引用。如下圖給我們這里有兩個不同的對象,盡管這兩個對象有同樣大小的數值。我們為什么在示意圖中使用盒子?沒錯,對象就象一個裝着內容的盒子。當一個對象被賦值到一個變量,就象在這個盒子上貼了一個標簽,表示創建了一個引用。每當這個對象有了一個新的引用,就會在盒子上新貼一張標簽。當一個引用被銷毀時,這個標簽就會被撕掉。當所有的標簽都被撕掉時,這個盒子就會被回收。

 

                                                               

    那么,Python 是怎么知道這個盒子有多少個標簽呢?每個對象都天生具有一個計數器,記錄它自己的引用次數。這個數目表示有多少個變量指向該對象。他就是上一節提到的引用計數器。

    提供了is和is not運算符來測試兩個變量是否指向同一個對象。

>>> a = "123"
>>> id(a)
48523104L
>>> b = "123"
>>> id(b)
48523104L
>>> a is b
True
>>> id(a) == id(b)
True
>>> 

四、工廠函數

  他們看上去像函數,但實際上他們是類。當你調用它們時,實際上是生成了該類型的一個實例。

  他們包含:int()、long()、float()、complex()、str()、unicode()、basestring()、list()、tuple()、type()、dict()、bool()、set()、frozenset()、object()、classmethod()、staticmethod()、super()、property()、file()

五、類型的分類

  按存儲模型

    1.標量/原子類型(數值,字符串)

    2.容器類型(列表、元祖、字典)

  按更新模型(重點看看哦

    1.可變類型(列表、字典)

      所謂可變對象是指,對象的內容可變,而不可變對象是指對象內容不可變。

>>> aList = ['java',66,88,'python']
>>> aList
['java', 66, 88, 'python']
>>> aList[2]
88
>>> id(aList)  #注意觀察id值
48255112L
>>> aList[2] = aList[2] + 12
>>> aList[3] = "python2"
>>> aList
['java', 66, 100, 'python2']
>>> id(aList)
48255112L  #注意觀察id值
>>> 

    2.不可變類型(數字、字符串、元祖)

    注意嘍:下面的例子中,事實上是一個新對象被創建,然后它取代了舊對象。新創建的對象被關聯到原來的變量名,舊對象被丟棄,垃圾回收器會在適當的時機回收這些對象。

>>> v1 = "python"
>>> id(v1)
31631080L
>>> v1 = "java"
>>> id(v1)
31632240L  #由於str是不可變的,重新創建了java對象,隨之id改變,舊對象python會在某個時刻被回收
>>> 
>>> v2 = 12
>>> v3 = 12
>>> id(v2),id(v3)  #同指同一內存區域,id相同
(31489840L, 31489840L)
>>> v2 += 1
>>> v2
13
>>> id(v2),id(v3)
(31489816L, 31489840L)
>>> 

 

 

  按訪問模型

    1.直接訪問(數字)

    2.順序訪問(字符串、列表、元祖)

    3.映射訪問(字典)

六、不支持的類型(該版本是2.*的不支持,3.*版本的個別可能會有支持了)

  1.char或byte

  2.指針

  3.int vs short vs long

  4.float vs double

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM