简明python教程 --C++程序员的视角(五):面向对象的编程
面向對象的編程
在大多數時候你可以使用過程性編程,但是有些時候當你想要編寫大型程序或是尋求一個更加合適的解決方案的時候,你就得使用面向對象的編程技術。
- 對象可以使用普通的屬于對象的變量存儲數據。屬于一個對象或類的變量被稱為域。
域有兩種類型——屬于每個實例/類的對象或屬于類本身。它們分別被稱為實例變量和類變量。 - 對象也可以使用屬于類的函數來具有功能。這樣的函數被稱為類的方法。
這些術語幫助我們把它們與孤立的函數和變量區分開來。域和方法可以合稱為類的屬性。類使用class關鍵字創建。類的域和方法被列在一個縮進塊中。
?
self
類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱,但是在調用這個方法的時候你不為這個參數賦值,Python會提供這個值。這個特別的變量指對象本身,按照慣例它的名稱是self。
雖然你可以給這個參數任何名稱,但是?強烈建議?你使用self這個名稱——其他名稱都是不贊成你使用的。使用一個標準的名稱有很多優點——你的程序讀者可以迅速識別它,如果使用self的話,還有些IDE(集成開發環境)也可以幫助你。
假如你有一個類稱為MyClass和這個類的一個實例MyObject。當你調用這個對象的方法MyObject.method(arg1, arg2)的時候,這會由Python自動轉為MyClass.method(MyObject, arg1, arg2)——這就是self的原理了。
這也意味著如果你有一個不需要參數的方法,你還是得給這個方法定義一個self參數。
?
類
我們使用class語句后跟類名,創建了一個新的類。這后面跟著一個縮進的語句塊形成類體。在這個例子中,我們使用了一個空白塊,它由pass語句表示。
接下來,我們使用類名后跟一對圓括號來創建一個對象/實例。(我們將在下面的章節中學習更多的如何創建實例的方法)。
為了驗證,我們簡單地打印了這個變量的類型。它告訴我們我們已經在__main__模塊中有了一個Person類的實例。可以注意到存儲對象的計算機內存地址也打印了出來。這個地址在你的計算機上會是另外一個值,因為Python可以在任何空位存儲對象。
?
對象的方法
我們已經討論了類/對象可以擁有像函數一樣的方法,這些方法與函數的區別只是一個額外的self變量。現在我們來學習一個例子,sayHi方法沒有任何參數,但仍然在函數定義時有self。
?
__init__方法
在Python的類中有很多方法的名字有特殊的重要意義。現在我們將學習__init__方法的意義。
__init__方法在類的一個對象被建立時,馬上運行。這個方法可以用來對你的對象做一些你希望的?初始化。注意,這個名稱的開始和結尾都是雙下劃線。
?
這里,我們把__init__方法定義為取一個參數name(以及普通的參數self)。在這個__init__里,我們只是創建一個新的域,也稱為name。注意它們是兩個不同的變量,盡管它們有相同的名字。點號使我們能夠區分它們。
最重要的是,我們沒有專門調用__init__方法,只是在創建一個類的新實例的時候,把參數包括在圓括號內跟在類名后面,從而傳遞給__init__方法。這是這種方法的重要之處。
現在,我們能夠在我們的方法中使用self.name域。這在sayHi方法中得到了驗證。
?
類與對象的變量
類與對象的數據部分,事實上,只是與類和對象的名稱空間?綁定?的普通變量,即這些名稱只在這些類與對象的前提下有效。有兩種類型的?域——類的變量和對象的變量。
這是一個很長的例子,但是它有助于說明類與對象的變量的本質。這里,population屬于Person類,因此是一個類的變量。name變量屬于對象(它使用self賦值)因此是對象的變量。
觀察可以發現__init__方法用一個名字來初始化Person實例。在這個方法中,我們讓population增加1,這是因為我們增加了一個人。同樣可以發現,self.name的值根據每個對象指定,這表明了它作為對象的變量的本質。
記住,你只能使用self變量來參考同一個對象的變量和方法。這被稱為?屬性參考。
在這個程序中,我們還看到docstring對于類和方法同樣有用。我們可以在運行時使用Person.__doc__和Person.sayHi.__doc__來分別訪問類與方法的文檔字符串。
就如同__init__方法一樣,還有一個特殊的方法__del__,它在對象消逝的時候被調用。對象消逝即對象不再被使用,它所占用的內存將返回給系統作它用。在這個方法里面,我們只是簡單地把Person.population減1。
當對象不再被使用時,__del__方法運行,但是很難保證這個方法究竟在?什么時候?運行。如果你想要指明它的運行,你就得使用del語句,就如同我們在以前的例子中使用的那樣。
?
?
?
繼承
面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過?繼承?機制。繼承完全可以理解成類之間的?類型和子類型關系。
繼承有很多優點。
- 如果我們增加/改變了SchoolMember中的任何功能,它會自動地反映到子類型之中。例如,你要為教師和學生都增加一個新的身份證域,那么你只需簡單地把它加到SchoolMember類中。然而,在一個子類型之中做的改動不會影響到別的子類型。
- 另外一個優點是你可以把教師和學生對象都作為SchoolMember對象來使用,這在某些場合特別有用,比如統計學校成員的人數。一個子類型在任何需要父類型的場合可以被替換成父類型,即對象可以被視作是父類的實例,這種現象被稱為多態現象。
另外,我們會發現在?重用父類的代碼的時候,我們無需在不同的類中重復它。而如果我們使用獨立的類的話,我們就不得不這么做了。
為了使用繼承,我們把基本類的名稱作為一個元組跟在定義類時的類名稱之后。
然后,我們注意到基本類的__init__方法專門使用self變量調用,這樣我們就可以初始化對象的基本類部分。這一點十分重要——Python不會自動調用基本類的constructor,你得親自專門調用它。
我們還觀察到我們在方法調用之前加上類名稱前綴,然后把self變量及其他參數傳遞給它。
注意,在我們使用SchoolMember類的tell方法的時候,我們把Teacher和Student的實例僅僅作為SchoolMember的實例。
另外,在這個例子中,我們調用了子類型的tell方法,而不是SchoolMember類的tell方法。可以這樣來理解,Python總是首先查找對應類型的方法,在這個例子中就是如此。如果它不能在導出類中找到對應的方法,它才開始到基本類中逐個查找。
一個術語的注釋——如果在繼承元組中列了一個以上的類,那么它就被稱作?多重繼承。
Python是一個高度面向對象的語言,理解這些概念會在將來有助于你進一步深入學習Python。
?
from:?http://www.cnblogs.com/wei-li/archive/2012/03/26/2417308.html
總結
以上是生活随笔為你收集整理的简明python教程 --C++程序员的视角(五):面向对象的编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 简明python教程 --C++程序员的
- 下一篇: 简明python教程 --C++程序员的