天天看點

《樹莓派Python程式設計指南》——3.6 使用類來建構對象

本節書摘來自華章計算機《樹莓派python程式設計指南》一書中的第3章,第3.6節,作者:(美) alex bradbury ben everard更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

類允許你将資料和函數組合起來構成一個對象。實際上,我們在前面章節中已經使用過它。回憶下這兩行:

《樹莓派Python程式設計指南》——3.6 使用類來建構對象

https://yqfile.alicdn.com/cf3a137ccff8e48abc102f32e14f61d197d0c716.png

" >

當時我們隻是快速跳過去,現在讓我們來看看它是如何工作的。turtle.turtle()傳回一個由turtle子產品中turtle類建立的對象。同樣的,tuttle.screen()傳回一個由turtle子產品中screen類建立的對象。簡而言之,類是用來建構對象的藍圖。對象可以存儲資料,并且提供可以讓你操作資料的方法。而方法其實就是類中的函數。

你已經見識過對象是多麼有用了。在第2章的例子中,你不用關心turtle的資料是如何存放的,因為它們已經包含在對象中了。你隻需要将turtle對象儲存在一個叫babbage的對象裡,當調用某個方法時,該方法就知道如何存取它需要的各種東西。這樣可以使程式整潔易用。例如下面的例子:

《樹莓派Python程式設計指南》——3.6 使用類來建構對象

https://yqfile.alicdn.com/ea45279ab371bc5f4df33ddd06e948805404a8ab.png

這行代碼将turtle向前移動并将結果畫在螢幕上。在螢幕上畫這條線,它知道用什麼顔色的畫筆,turtle的起始位置在哪裡以及其他各種它所需要的資訊,因為它們都已經存儲在對象中了。

讓我們用一個簡單的例子看看對象裡都有什麼東西:

《樹莓派Python程式設計指南》——3.6 使用類來建構對象

這裡有幾點需要注意,python中,變量、函數和方法的名字通常用小寫字母,類是個例外。是以person類由大寫字母p開頭。如果不這樣做python也不會報錯,但遵守慣例可以友善人們閱讀對方的代碼。可以看到,方法的定義方式和函數一樣,差別隻是參數總是以self開始,這表示本地變量。在這個例子中,本地變量包括self.age和self.name。它們會在類的每一個執行個體中都建立一份。本例中,我們用people類建立了兩個對象(即類的執行個體),每個對象都有各自的一份self.age和self.person拷貝。我們可以在對象外面讀寫它們(就像我們在print方法中使用的那樣)。這被稱為person類的屬性。

這裡還有兩個方法。__init__是每個類都有的特殊方法。該方法在建立或“初始化”類的執行個體時會被調用。是以,ben = person(31, “ben”)會建立person類的一個對象,并使用參數(31, “ben”)調用__int__方法。通常可以用來設定屬性。第二個方法birthday()展示了如何使用類方法而不用在類的外面關心資料的儲存問題。給person對象一個birthday()方法,拿來用就可以了,例如:

《樹莓派Python程式設計指南》——3.6 使用類來建構對象

它将把age加一。

有時,我們不希望從頭開始建立類,而是根據已經存在的類來建一個新的類。例如,如果你想建立一個類來儲存parents(父母)的相關資訊,它們也存在年齡(age),名字(name),和生日(birthday),如果再為parent寫一遍這些代碼就會顯得浪費。python允許我們從其他類中繼承。下面給出一個例子:

《樹莓派Python程式設計指南》——3.6 使用類來建構對象

person是parent的超類,parent是person的子類。把類名放入要定義的類名後面的括号裡,它就變成這個要定義的類的超類。你可以調用超類的__init__方法,會自動獲得超類的屬性和方法的通路權限而不用重寫代碼。

類的最大優勢就是它可以友善重用代碼。像我們在前幾章中看到的那樣,它可以友善地操縱turtle而不用關心它做了些什麼,是怎麼做的。因為turtle類封裝了這些資訊,你隻要知道方法名字,就可以毫無障礙地使用它們了。貫穿本書,你将看到如何使用類提供的方法友善地建構複雜遊戲,而不用擔心這些方法的技術細節是如何實作的。

下面的代碼使用類重寫了學生資料庫程式,感受下類是如何工作的(檔案名chapter3-student-2.py)

《樹莓派Python程式設計指南》——3.6 使用類來建構對象
《樹莓派Python程式設計指南》——3.6 使用類來建構對象
《樹莓派Python程式設計指南》——3.6 使用類來建構對象

https://yqfile.alicdn.com/6008116c2455ba84e4dbc144b47fbb3e1aead45b.png" >