簡介
到目前為止,在我們的程式中,我們都是根據操作資料的函數或語句塊來設計程式的。這被稱為 面向過程的 編程。還有一種把資料和功能結合起來,用稱為對象的東西包裹起來組織程式的方法。這種方法稱為 物件導向的 編程理念。在大多數時候你可以使用過程性編程,但是有些時候當你想要編寫大型程式或是尋求一個更加合適的解決方案的時候,你就得使用物件導向的編程技術。
類和對象是物件導向編程的兩個主要方面。類建立一個新類型,而對象這個類的 執行個體 。這類似於你有一個int類型的變數,這儲存整數的變數是int類的執行個體(對象)。
給C/C++/Java/C#程式員的注釋
注意,即便是整數也被作為對象(屬於int類)。這和C++、Java(1.5版之前)把整數純粹作為類型是不同的。通過help(int)瞭解更多這個類的詳情。 C#和Java 1.5程式員會熟悉這個概念,因為它類似與 封裝與解鎖裝 的概念。
對象可以使用普通的 屬於 對象的變數儲存資料。屬於一個對象或類的變數被稱為域。對象也可以使用 屬於 類的函數來具有功能。這樣的函數被稱為類的方法。這些術語協助我們把它們與孤立的函數和變數區分開來。域和方法可以合稱為類的屬性。
域有兩種類型——屬於每個執行個體/類的對象或屬於類本身。它們分別被稱為執行個體變數和類變數。
類使用class關鍵字建立。類的域和方法被列在一個縮排塊中。
self
類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱,但是在調用這個方法的時候你不為這個參數賦值,Python會提供這個值。這個特別的變數指對象本身,按照慣例它的名稱是self。
雖然你可以給這個參數任何名稱,但是 強烈建議 你使用self這個名稱——其他名稱都是不贊成你使用的。使用一個標準的名稱有很多優點——你的程式讀者可以迅速識別它,如果使用self的話,還有些IDE(整合式開發環境)也可以協助你。
給C++/Java/C#程式員的注釋
Python中的self等價於C++中的self指標和Java、C#中的this參考。
你一定很奇怪Python如何給self賦值以及為何你不需要給它賦值。舉一個例子會使此變得清晰。假如你有一個類稱為MyClass和這個類的一個執行個體MyObject。當你調用這個對象的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉為MyClass.method(MyObject, arg1, arg2)——這就是self的原理了。
這也意味著如果你有一個不需要參數的方法,你還是得給這個方法定義一個self參數。
類
一個儘可能簡單的類如下面這個例子所示。
建立一個類
例11.1 建立一個類
#!/usr/bin/python
# Filename: simplestclass.py
class Person:
pass # An empty block
p = Person()
print p