| 導航:起始頁 > Dive Into Python > 對象和面向對象 > 類的定義 | << >> | ||||
深入 Python :Dive Into Python 中文版Python 從新手到專家 [Dip_5.4b_CPyUG_Release] |
|||||
Python 是完全面向對象的:你可以定義自已的類,從自已的或內置的類繼承,然后從你定義的類創建實例。
在 Python 中定義類很簡單。就像定義函數,沒有單獨的接口定義。只要定義類,然后就可以開始編碼。Python 類以保留字 class 開始,后面跟著類名。從技術上講,有這些就夠了,因為一個類并非必須從其它類繼承。
| 在 Python 中的 pass 語句就像 Java 或 C 中的大括號空集 ({})。 | |
當然,實際上大多數的類都是從其它的類繼承來的,并且它們會定義自已的類方法和屬性。但是就像你剛才看到的,除了名字以外,類沒有什么必須要具有的。特別是,C++ 程序員可能會感到奇怪,Python 的類沒有顯示的構造函數和析構函數。Python 類的確存在與構造函數相似的東西:__init__ 方法。
from UserDict import UserDict class FileInfo(UserDict):
| 在 Python 中,類的基類只是簡單地列在類名后面的小括號里。所以 FileInfo 類是從 UserDict 類 (它是從 UserDict 模塊導進來的) 繼承來的。UserDict 是一個像字典一樣工作的類,它允許你完全子類化字典數據類型,同時增加你自已的行為。{也存在相似的類 UserList 和 UserString ,它們允許你子類化列表和字符串。)[2] 在這個類的背后有一些“巫術”,我們將在本章的后面,隨著更進一步地研究 UserDict 類,揭開這些秘密。 |
| 在 Python 中,類的基類只是簡單地列在類名后面的小括號里。不像在 Java 中有一個特殊的 extends 關鍵字。 | |
Python 支持多重繼承。在類名后面的小括號中,你可以列出許多你想要的類名,以逗號分隔。
本例演示了使用 __init__ 方法來進行 FileInfo 類的初始化。
class FileInfo(UserDict): "store file metadata"def __init__(self, filename=None):
![]()
![]()
| 類也可以 (并且應該) 有 doc strings ,就像方法和函數一樣。 | |
| __init__ 在類的實例創建后被立即調用。它可能會引誘你稱之為類的構造函數,但這種說法并不正確。說它引誘,是因為它看上去像 (按照習慣,__init__ 是類中第一個定義的方法),行為也像 (在一個新創建的類實例中,它是首先被執行的代碼),并且叫起來也像 (“init”當然意味著構造的本性)。說它不正確,是因為對象在調用 __init__ 時已經被構造出來了,你已經有了一個對類的新實例的有效引用。但 __init__ 是在 Python 中你可以得到的最接近構造函數的東西,并且它也扮演著非常相似的角色。 | |
| 每個類方法的第一個參數,包括 __init__,都是指向類的當前實例的引用。按照習慣這個參數總是被稱為 self。在 __init__ 方法中,self 指向新創建的對象;在其它的類方法中,它指向方法被調用的類實例。盡管當定義方法時你需要明確指定 self,但在調用方法時,你不 用指定它,Python 會替你自動加上的。 | |
| __init__ 方法可以接受任意數目的參數,就像函數一樣,參數可以用缺省值定義,即可以設置成對于調用者可選。在本例中,filename 有一個缺省值 None,即 Python 的空值。 |
| 習慣上,任何 Python 類方法的第一個參數 (對當前實例的引用) 都叫做 self。這個參數扮演著 C++ 或 Java 中的保留字 this 的角色,但 self 在 Python 中并不是一個保留字,它只是一個命名習慣。雖然如此,也請除了 self 之外不要使用其它的名字,這是一個非常堅固的習慣。 | |
當定義你自已的類方法時,你必須 明確將 self 作為每個方法的第一個參數列出,包括 __init__。當從你的類中調用一個父類的一個方法時,你必須包括 self 參數。但當你從類的外部調用你的類方法時,你不必對 self 參數指定任何值;你完全將其忽略,而 Python 會自動地替你增加實例的引用。我知道剛開始這有些混亂,它并不是自相矛盾的,因為它依靠于一個你還不了解的區別 (在綁定與非綁定方法之間),故看上去是矛盾的。
噢。我知道有很多知識需要吸收,但是你要掌握它。所有的 Python 類以相同的方式工作,所以一旦你學會了一個,就是學會了全部。如果你忘了別的任何事,也要記住這件事,因為我認定它會讓你出錯:
| __init__ 方法是可選的,但是一旦你定義了,就必須記得顯示調用父類的 __init__ 方法 (如果它定義了的話)。這樣更是正確的:無論何時子類想擴展父類的行為,后代方法必須在適當的時機,使用適當的參數,顯式調用父類方法。 | |
[2] 在 2.2 之后已經可以從 dict、list 來派生子類了,關于這一點作者在后文也會提到。――譯注
<< 使用 from module import 導入模塊 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
類的實例化 >> |