天天看點

面向對象

oop: the big picture

程式就是“用一些東西來做事情”,而類就是一種定義新種類的東西的方式,它反映了在程式領域中的真實對象。

類的三個獨特性質:

類本質上是生成一個或多個對象的工廠。每次調用類時, 都會生成一個具有獨特命名空間的新對象。從類生成的每個對象都可以通路類的屬性, 并為每個對象的不同資料擷取其自己的命名空間。

類還支援 oop 繼承概念;我們可以通過在編碼為子類的新軟體元件中重新定義類本身的屬性來擴充類。通常, 類可以建立命名空間層次結構, 定義由層次結構中的類建立的對象所使用的名稱。這比其他工具更直接支援多個可自定義的行為。

通過提供特殊的協定方法, 類可以定義響應我們在内置類型的工作中看到的操作類型的對象。例如, 可以對使用類進行的對象進行切片、串聯、索引等。python 提供了類可用于攔截和實作任何内置類型操作的挂鈎。

在它的基礎上, oop 在 python 中的機制主要隻是 two bits of magic: 函數中的特殊第一個參數 (接收調用的對象) 和繼承屬性搜尋 (支援通過自定義程式設計)。除了這一點之外, 模型基本上隻是最終處理内置類型的函數。雖然不完全是新的, 但 oop 添加了額外的結構層, 支援比平面程式模型更好的程式設計。

*** oop is as much an experience as a technology.***

大多數 oop 均可使用下面的式子來表達:

<code>class</code> 産生類時, 表達式在 python 中啟動搜尋-它搜尋連接配接對象的樹, 查找它可以找到的首次出現的屬性。當涉及類時, 前面的 python 表達式有效地轉換為自然語言中的以下内容:

通過查找對象, 然後在它上面的所有類中, 從下到上, 從左到右查找屬性的第一個比對項。

換言之, 屬性提取隻是樹搜尋。由于樹中較低的對象繼承附加到該樹中較高對象的屬性, 是以應用了術語繼承。當搜尋從底部向上進行時, 從某種意義上說, 連結到樹中的對象是所有樹父級中定義的所有屬性的聯合, 所有這些特性都達到樹的頂端。

我們用代碼建構連結對象的樹, 而 python 在每次使用對象時都會在運作時通過 <code>object.attribute</code> 表達式“爬樹”去搜尋屬性。

面向對象

classes

serve as instance factories. their attributes provide behavior—data and functions —that is inherited by all the instances generated from them (e.g., a function to compute an employee’s salary from pay and hours).

instances

represent the concrete items in a program’s domain. their attributes record data that varies per specific object (e.g., an employee’s social security number).

類語句建立類對象并為其配置設定名稱。與函數 <code>def</code> 語句一樣, python <code>class</code> 語句是可執行語句。運作時, 它将生成一個新的類對象, 并将其配置設定給類标頭中的名稱。此外, 與 <code>def</code> 一樣, 類語句通常在第一次導入它們所編碼的檔案時運作。

<code>class</code> 語句内的指派建立類屬性。就像在子產品檔案中一樣, 類語句中的頂層指派 (不嵌套在 <code>def</code> 中) 在類對象中生成屬性。從技術上講, 類語句定義了一個局部作用域, 它會變成類對象的屬性命名空間, 就像子產品的全局作用域一樣。運作類語句後, 将按名稱限定: <code>object.name</code> 來通路類屬性。

類屬性提供對象狀态和行為。類對象的屬性記錄狀态資訊和要由類建立的所有執行個體共享的行為;嵌套在類中的函數 <code>def</code> 語句生成處理執行個體的方法。

執行個體對象是具體的元素:

調用類對象 (如函數) 會産生一個新的執行個體對象。每次調用類時, 它都會建立并傳回一個新的執行個體對象。執行個體表示程式域中的具體項。

每個執行個體對象都繼承類屬性并擷取其自己的命名空間。從類建立的執行個體對象是新的命名空間;它們開始為空, 但繼承在從中生成它們的類對象中的屬性。

在方法中對<code>self</code> 屬性的指派使每執行個體屬性。在類的方法函數中, 第一個參數 (一般約定為 <code>self</code>) 引用正在處理的執行個體對象;對自身屬性的指派在執行個體中建立或更改資料, 而不是類。

最終的結果是類定義公共的、共享的資料和行為, 并生成執行個體。執行個體反映具體的應用程式實體, 并記錄每個對象可能有所不同的每執行個體資料。

詳細内容見:類與對象

子產品反映了整個檔案

類隻是檔案内的語句

為 <code>rec</code> 類添加屬性:

命名空間對象的屬性通常都是以字典的形式實作的,而類繼承樹(一般而言)隻是連接配接至其他字典的字典而已。例如, <code>__dict__</code> 屬性是針對大多數基于類的對象的命名空間字典 (一些類也可能在 <code>__slots__</code> 中定義屬性)。

使用 <code>__class__</code> 擷取執行個體的繼承:

使用 <code>__bases__</code> 擷取類的超類:

python 的類模型是相當動态:類和執行個體隻是命名空間對象,屬性是通過指派語句動态建立的。

類中的函數 (<code>def</code> 語句)一般稱作方法,代表類的邏輯。

探尋有趣之事!