在學習python的物件導向時,我始終參照的是c++的物件導向機制。相對而言,python的物件導向確實更簡單一些。
基礎:
- 整數也被作為對象。前面就看到過,說所有的東西都是對象,包括函數。
- 屬於一個對象或類的變數被稱為域——這個名稱有點奇怪,c++叫成員。
- 域分為兩種,分別屬於對象和屬於類——其實就是成員和靜態成員。
- Self指標:相當於c++中的this。文檔是否有問題,c++有self嗎?
- 類的方法的第一個參數必須是self?為什嗎?目前來說不帶self是會運行失敗的。
__init__方法
- 類的建構函式是__init__方法,它在建立類的時候調用。
- 它並不是必須的,可以沒有。
- 它可以有多個,啟動並執行時候不會出錯,但是只可以調用參數最多的那個。其他的一調用就有問題。
成員變數和類的變數,方法
- 類變數的定義:縮排和方法的縮排相同。引用的時候,需要使用class.變數名的方式。
- 物件變數的定義:要通過self.變數名的形式在__init__方法中定義。這個是合理:不可以把成員的定義散布在代碼的各個地方。而且只能在這裡定義,在其他的方法中是無法定義的。
- 如果在其他的方法中定義:self.變數名,那麼它只能在這個方法中以self.變數名的方式調用。
- 而且,在對象方法的一級縮排上,self是不合法的。那個應該屬於類的地區。
- 是否可以定義一個類的全域的方法,類似於c++的static方法?也許python根本就不需要這麼做,有他的處理方案。什麼方案?後面要瞭解一下。
解構函式
__del__方法相當於他的解構函式,在對象被銷毀的時候調用。
層級
如何定義private和public?預設的,都是public,如果名稱加雙底線:__,這表示是private。有點怪。
繼承:
繼承時成員特性:
- 對於類的成員,在子類中可以通過父類.變數名或者子類.變數名來訪問,是相同的。
- 對於對象的成員,在子類中通過self.變數名來訪問。但是無法訪問以__開頭的的私人變數。
繼承時方法的特性:
- 產生子類的建構函式的時候,不會自動調用父類的建構函式,你必須手動調用它。同時,在對象釋放的時候,同樣要手動調用解構函式。
- 子類的建構函式和解構函式可以不定義,如果不定義的話,這會調用基類的構造和解構函式。
- Python不存在動態綁定和靜態繫結。這一點和c++不同。
- 如果基類有一個public函數,子類中重新定義一個和他名稱相同,但是多一個參數的函數,多的這個參數使用預設參數。這樣來調用的話,調用的子類的函數,而不是父類的函數。應該是這樣。
這種繼承模型確實非常簡單。
特殊方法:
- __init__(self,...) 這個方法在建立對象恰好要被返回使用之前被調用。
- __del__(self) 恰好在對象要被刪除之前調用。
- __str__(self) 在我們對對象使用print語句或是使用str()的時候調用。
- __lt__(self,other) 當使用 小於運算子(<)的時候調用。類似地,對於所有的運算子(+,>等等)都有特殊的方法。
- __getitem__(self,key) 使用x[key]索引操作符的時候調用。
- __len__(self) 對序列對象使用內建的len()函數的時候調用。
其他:
- 檔案:3.0後,開啟檔案的函數變為了open而不是原有的file。檔案必須要close嗎?如果不close是否會泄露?
- 儲存空間:Cpickle模組能夠將一個對象完整的儲存在一個檔案中,後面可以再把它給開啟,一模一樣。在3.0中,模組Cpickle和pickle都合為pickle。
- 列表綜合:可以從一個已有的列表匯出一個新的列表。
- 可以在函數中通過*和**接受元組和列表。
- Lambda可以產生一個新的函數對象。
- Exec函數和eval函數可以自行儲存在字串中的python語句。這個將運行編寫更加智能的代碼。
進一步學習計劃
我在工作中的主要語言是c和c++。聽說google在工作中會用python和c++一起編程,python用作膠水語言。混搭可能會成為一種趨勢,可以充分的發揮各個語言的優勢。我會在工作中找機會嘗試一下,看效果如何。我認為,一個語言能夠方便的調用其他的語言,以及被其他語言調用,可能會成為一個語言的重要的一個特性。
其次,我一直以來都想開發一個關於學習的網站,同時,Google App Engine支援python,所以,我可能會利用業餘時間用python開發一個運行在google app engine的網站。
下一步的學習資料,我選擇的是《深入理解Python》,希望能夠更深一步的瞭解python。同時,我可能會找一些相關的源碼來學習一些如何使用python開放大型程式。