3.Python對象

一.對象

  1. Python 對象 : Python使用對象模型來存儲數據.構造任何類型的值都是一個對象,. 儘管Python通常當成一種 "面向對象的程式語言" ,但是你完全能夠寫出不使用任何類和實例的實用腳本.
  2. 所有的Python對象都擁有三個特徵 : 身份,類型和值 .
    1. 身份 : 每一個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建 函數id() 來得到. 這個值被認為是改對象的記憶體地址.
    2. 類型 : 對象的類型決定了該對象可以保存什麼類型的值,可以進行什麼樣的操作, 一級遵循什麼樣的規則.可以通過函數type()查看Python對象的類型. 3.值 : 對象表示的數據項 .

上面三個特性在對象創建的時候就被賦值,除了值之外,其他兩個特性都是只讀的.對 於新風格的類型和類,對象的類型也是可以改變的,不過對於初學者並不推薦這樣做.

  1. 對象屬性 : 某些Python對象有屬性,值,或相關聯的可執行程式碼,比如方法(method) . Python用點(.) 標記法開訪問屬性. 屬性包括相應對象的名字等等 . 最常用的屬性是函數和方法 ,不過有一些Python類型也有數據屬性. 含有數據屬性的對象包括(但不限於) : 類,類實例,模組和複數 .

二. 標準類型(基本數據類型) :

  1. 整數
  2. 浮點數
  3. 布爾值
  4. 複數
  5. 字元串
  6. 列表
  7. 元組
  8. 字典

三.其他內建類型 :

  1. 類型
  2. Null對象(None)
  3. 文件
  4. 集合/固定集合
  5. 函數/方法
  6. 模組
  7. 類型對象和type類型對象 : 雖然看上去把類型本身也當成對象有點特別,我們還是要在這裡提一提. 你一定還記得,對象的一系列固有行為和特徵(比如支援哪些運算,具有哪些方法) 必須事先定義好. 從這個角度看,類型正是保存這些資訊的最佳位置. 描述一種類型所需要的資訊不可能用一個字元串來搞定, 所以類型不能是一個簡單的字元串,這些資訊不能也不應該和數據保存在一起,所以我們將類型定義成對象.
  8. 所有類型對象的類型都是type ,它也是所有Python類型的根和所有Python標準類的默認元類(metaclass) . 類就是類型,實例是對應類型的對象.
  9. None,Python的Null 對象 : Python有一個特殊的類型,被稱作Null對象或者NoneType ,它只有一個值,那就是None.它不支援任何運算也沒有任何內建方法. None沒有什麼有用的屬性,它的布爾值總是False.
  10. 核心筆記 : 布爾值 . 所有標準對象均可用於布爾測試,同類型的對象之間可以比較大小 . 每個對象天生具有布爾True 或 False .空對象,值為零的任何數字或者Null對象None的布爾值都是False .下列對象的布爾值是False :
    1. None
    2. False
    3. 所有值為零的數
    4. 0 (整型)
    5. 0.0(浮點型)
    6. 0.0+0.0j(複數)
    7. '' (空字元串)
    8. [] (空列表)
    9. () (空元組)
    10. {} (空字典) 值不是上面列出來的任何值的對象的而不知都是True , 例如non-empty ,non-zero 等 等 . 用戶創建的類實例如果定義了nonzero(_nonzero)()) 或length(len()) 且 值為 0 ,那麼他們的布爾值就是False .

四. 內部類型

● 程式碼 ● 幀 ● 跟蹤記錄 ● 切片 ● 省略 ● Xrange

  1. 程式碼對象 :
  2. 幀對象 :
  3. 跟蹤記錄對象 : 當你的程式碼出錯時 , Python就會引發一個異常 . 如果異常未被捕獲和處理,解釋器就會退出腳本運行 ,處理程式就可以訪問這個跟蹤記錄對象 .
  4. 切片對象 : 當使用Python擴展的切片語法時,就會創建切片對象. 擴展的切片語法允許對不同的索引切片操作,包括步進切片,多維切片,及省略切片 . 切片對象也可以由內建函數 slice() 來生成 . 步進切片允許利用第三個切片元素進行步進切片.
  5. 省略對象 :
  6. XRange 對象 : 調用內建函數xrange() 會生成一個Xrange對象,xrange() 是內建函數range() 的兄弟版,用於需要節省記憶體使用或range() 無法完成的超大數據集場合 .

五. 標準類型運算符

  1. 比較運算符用來判斷同類型對象是否相等,所有內建類型均支援比較運算,比較運算返回布爾值True 或 False .
  2. 不同於很多其他語言,多個比較操作可以在同一行上進行, 求值順序從左到右 .
  3. 我們會注意到,比較操作是針對對象的值進行的,也就是說比較的是對象的數值而不是對象本身.
  4. 對象身份比較 : 作為對值比較的補充,Python也支援對象本身的比較. 對象可以被賦值到另一個變數(通過引用) . 因為每個變數都指向同一個(共享的) 數據對象, 只要任何一個引用發生改變, 該對象的其他引用也會隨之改變 .
  5. is is not : Python提供了is 和is not 運算符來測試兩個變數是否指向同一個對象(對象身份).
  6. 核心提示 : 小整數池 .
  7. 布爾類型 : not 運算符擁有最高優先順序, 只比所有運算低一級. and 和 or 運算符則相應的再低一點.
  8. 前面提到過Python支援一個表達式進行多種比較操作 ,其實這個表達式本質上是由多個隱式的and 鏈接起來的多個表達式.

六.標準類型內建函數

  1. type() : 接收一個對象作為參數,並返回它的類型, 它的返回值是一個類型對象 . 對type()的返回值再次調用type() ,注意type() 有趣的輸出 .
  2. 核心筆記 : 在Python學習過程中, 偶爾會遇到某個運算符和某個函數是做同樣一件事情 ,之所以如此是因為某些場合函數會比運算符更適合使用. 函數比表達式用起來方便 .
  3. type() 和isinstance() : Python不支援方法或函數重載,因此你必須自己保證調用的就是你想要的函數或對象 . type() 函數可以做到這一點 . isinstance 來判斷某個對象是否是某個類的實例. 返回True 或 False .
  4. 減少函數調用的次數 : 如果我們減少函數的調用次數, 就會提高程式的性能 .

七. 類型工廠函數

  1. Python2.2.同意了類型和類,所有的內建類型現在也都是類 . 在這些基礎上,原來的所謂內建轉換函數像int() , type() ,list() 等等,現在都成了工廠函數 . 也就是說雖然他們看上去有點像函數,實質上他們是類.當你調用他們時,實際上是生成了該類型的一個實例 .

八.標準類型的分類

  1. 如果讓我們最啰嗦的描述標準類型, 我們也許會稱他們是Python的基本內建數據對象原始類型 .
    1. "基本" : 是指這些類型都是Python提供的標準或核心類型
    2. "內建" : 是由於這些類型是Python默認就提供的
    3. "數據" :因為他們用於一般數據存儲
    4. "對象" : 因為對象是數據和功能的默認抽象
    5. "原始" : 因為這些類型提供的是最底層的粒度數據存儲
    6. "類型" 因為他們就是數據類型
  2. 存儲模型 : 我們隊類型進行分類的第一種方式 ,就是看看這種類型的對象能保存多少個對象. Python的類型,就像絕大多數其他語言一樣,能容納一個或多個值.一個能保存單個字面對象的類型我們稱它為院子或標量存儲.那些可容納多個對象的類型,我們稱之為容器存儲.(容器對象有時會在文檔中被稱為複合對象,不過這些對象並不僅僅指類型,還包括類似實例這樣的對象)容器類型又帶來一個新問題,那就是它是否可以容納不同類型的對象. 所有的Python容器對象都能夠容納不同類型的對象.字元串看上去看一個容器類型,因為它"包含"字元(並且經常多餘一個字元),不過由於Python並沒有字元類型,所以字元串是一個自我包含的文字類型.
    1. 標量 / 原子類型 : 數值,字元串
    2. 容器類型 : 列表,元組,字典
  3. 更新模型 : 另一種對標準類型進行分類的方式就是,針對每一個類型問一個問題:'對象創建成功之後,它的值可以進行更新么 ? 某些類型允許他們的值進行更新,而另一些則不允許 . 可變對象允許他們的值被更新,而不可變對象則不允許他們的值被更改 .
  4. 為什麼i = 0 ,i = i + 1 , i為什麼等於1 . 不是說數值和字元串對象是不可改變的么 ? 事實上,這裡是一個新對象被創建,然後它取代了舊對象. 通過id()函數就可以很清楚的看到對象實際上已經被替換了.
  5. 訪問類型 :儘管前面兩種模型分類方式在介紹Python時都很有用,他們還不是區分數據類型的首要模型. 對這種目的,我們使用訪問模型.也就是說根據訪問外面存儲的數據的方式對數據類型進行分類.在訪問模型中共有三種訪問方式 : 直接存取,順序,和映射 .
    1. 對非容器類型可以直接訪問,.所有數值類都歸到這一類
    2. 序列類型是指容器內的元素按從0 開始的索引順序訪問. 一次可以訪問一個元素或多個元素,也就是大家所了解的切片. 字元串,列表和元組都歸到這一類.前面說過,Python不支援字元類型,因此,雖然字元串是簡單的文字類型,因為它有能力按照順序訪問子字元串,所以也將它歸到序列類型.
    3. 映射類型類似序列的縮影屬性忙不過來它的縮影並不使用順序的數字偏移量取值,它的元素無序存放,通過一個唯一的key來訪問,這就是映射類型,它容納的是哈希鍵值對的集合.
  6. 為什麼要對同樣的數據類型再三分類呢 ? 首先,我們為什麼要分類 ? 因為Python提供了高級的數據結構,我們需要將那些原始的類型和功能強大的擴展類型區分開來. 另一個原因就是這有助於搞清楚某種類型應該具有什麼行為.
    1. 直接訪問 : 數字
    2. 順序訪問 : 字元串,列表,元組
    3. 映射訪問 : 字典 數據類型 存儲類型 更新模型 訪問類型 數字 Scalar 不可更改 直接訪問 字元串 Scalar 不可更改 順序訪問 列表 Container 可更改 順序訪問 元組 Container 不可更改 順序訪問 字典 Container 可更改 映射訪問

7.為什麼要用這麼多不同的模型或從不同的方面來分類 ? 所有這些數據類型看上去是很難分類的.他們彼此都有著錯綜複雜的關係,所有類型的共同之處最好能揭示出來,而且我們還想揭示每種類型的督導之處.沒有兩種類型橫跨所有的分類. (當然,所有 的數值子類型能刀座了這一點,所以我們將它們歸納到一類當中) .最後我們確信搞清楚所有類型之間的關係會對你的開發工作有極大的幫助.你對每種類型了解越多,你就越能在自己的程式中使用恰當的類型以達到最佳的性能.

8.不支援的類型

  1. char或byte : Python沒有這兩種類型來保存單一字元或8比特整數.你可以使用長度為1的字元串表示字元或8比特整數
  2. 指針: Python替你管理記憶體,因此沒有必要訪問指針. 你可以用id()得到一個對象的身份號, 這是最接近指針的地址.因為你不能控制這個值,所以其實沒有太大意義.在Python中,一切都是指針 .