天天看點

Python 面向對象程式設計(一)

 Python 面向對象程式設計(一)

  雖然Python是解釋性語言,但是它是面向對象的,能夠進行對象程式設計。下面就來了解一下如何在Python中進行對象程式設計。

一.如何定義一個類

  在進行python面向對象程式設計之前,先來了解幾個術語:類,類對象,執行個體對象,屬性,函數和方法。

  類是對現實世界中一些事物的封裝,定義一個類可以采用下面的方式來定義:

  注意類名後面有個冒号,在block塊裡面就可以定義屬性和方法了。當一個類定義完之後,就産生了一個類對象。類對象支援兩種操作:引用和執行個體化。引用操作是通過類對象去調用類中的屬性或者方法,而執行個體化是産生出一個類對象的執行個體,稱作執行個體對象。比如定義了一個people類:

  people類定義完成之後就産生了一個全局的類對象,可以通過類對象來通路類中的屬性和方法了。當通過people.name(至于為什麼可以直接這樣通路屬性後面再解釋,這裡隻要了解類對象這個概念就行了)來通路時,people.name中的people稱為類對象,這點和C++中的有所不同。當然還可以進行執行個體化操作,p=people( ),這樣就産生了一個people的執行個體對象,此時也可以通過執行個體對象p來通路屬性或者方法了(p.name).

  了解了類、類對象和執行個體對象的差別之後,我們來了解一下Python中屬性、方法和函數的差別。

  在上面代碼中注釋的很清楚了,name是一個屬性,printName( )是一個方法,與某個對象進行綁定的函數稱作為方法。一般在類裡面定義的函數與類對象或者執行個體對象綁定了,是以稱作為方法;而在類外定義的函數一般沒有同對象進行綁定,就稱為函數。

二.屬性

  在類中我們可以定義一些屬性,比如:

  定義了一個people類,裡面定義了name和age屬性,預設值分别為'jack'和12。在定義了類之後,就可以用來産生執行個體化對象了,這句p = people( )執行個體化了一個對象p,然後就可以通過p來讀取屬性了。這裡的name和age都是公有的,可以直接在類外通過對象名通路,如果想定義成私有的,則需在前面加2個下劃線 ' __'。

  這段程式運作會報錯:

  

Python 面向對象程式設計(一)

  提示找不到該屬性,因為私有屬性是不能夠在類外通過對象名來進行通路的。在Python中沒有像C++中public和private這些關鍵字來差別公有屬性和私有屬性,它是以屬性命名方式來區分,如果在屬性名前面加了2個下劃線'__',則表明該屬性是私有屬性,否則為公有屬性(方法也是一樣,方法名前面加了2個下劃線的話表示該方法是私有的,否則為公有的)。

三.方法

  在類中可以根據需要定義一些方法,定義方法采用def關鍵字,在類中定義的方法至少會有一個參數,,一般以名為'self'的變量作為該參數(用其他名稱也可以),而且需要作為第一個參數。下面看個例子:

<a></a>

Python 面向對象程式設計(一)

  如果對self不好了解的話,可以把它當做C++中類裡面的this指針一樣了解,就是對象自身的意思,在用某個對象調用該方法時,就将該對象作為第一個參數傳遞給self。

四.類中内置的方法

  在Python中有一些内置的方法,這些方法命名都有比較特殊的地方(其方法名以2個下劃線開始然後以2個下劃線結束)。類中最常用的就是構造方法和析構方法。

  構造方法__init__(self,....)在生成對象時調用,可以用來進行一些初始化操作,不需要顯示去調用,系統會預設去執行。構造方法支援重載,如果使用者自己沒有重新定義構造方法,系統就自動執行預設的構造方法。

  析構方法__del__(self)在釋放對象時調用,支援重載,可以在裡面進行一些釋放資源的操作,不需要顯示調用。

  還有其他的一些内置方法:

  比如 __cmp__( ), __len( )__等,具體的用法可以參考這篇博文:

  http://www.cnblogs.com/simayixin/archive/2011/05/04/2036295.html

五.類屬性、執行個體屬性、類方法、執行個體方法以及靜态方法

  在了解了類基本的東西之後,下面看一下python中這幾個概念的差別。

  先來談一下類屬性和執行個體屬性

  在前面的例子中我們接觸到的就是類屬性,顧名思義,類屬性就是類對象所擁有的屬性,它被所有類對象的執行個體對象所共有,在記憶體中隻存在一個副本,這個和C++中類的靜态成員變量有點類似。對于公有的類屬性,在類外可以通過類對象和執行個體對象通路。

  執行個體屬性是不需要在類中顯示定義的,比如:

  在類外對類對象people進行執行個體化之後,産生了一個執行個體對象p,然後p.age = 12這句給p添加了一個執行個體屬性age,指派為12。這個執行個體屬性是執行個體對象p所特有的,注意,類對象people并不擁有它(是以不能通過類對象來通路這個age屬性)。當然還可以在執行個體化對象的時候給age指派。

  如果需要在類外修改類屬性,必須通過類對象去引用然後進行修改。如果通過執行個體對象去引用,會産生一個同名的執行個體屬性,這種方式修改的是執行個體屬性,不會影響到類屬性,并且之後如果通過執行個體對象去引用該名稱的屬性,執行個體屬性會強制屏蔽掉類屬性,即引用的是執行個體屬性,除非删除了該執行個體屬性。

Python 面向對象程式設計(一)

  下面來看一下類方法、執行個體方法和靜态方法的差別。

  類方法:是類對象所擁有的方法,需要用修飾器"@classmethod"來辨別其為類方法,對于類方法,第一個參數必須是類對象,一般以"cls"作為第一個參數(當然可以用其他名稱的變量作為其第一個參數,但是大部分人都習慣以'cls'作為第一個參數的名字,就最好用'cls'了),能夠通過執行個體對象和類對象去通路。

  類方法還有一個用途就是可以對類屬性進行修改:

  運作結果:

Python 面向對象程式設計(一)

  結果顯示在用類方法對類屬性修改之後,通過類對象和執行個體對象通路都發生了改變。

  執行個體方法:在類中最常定義的成員方法,它至少有一個參數并且必須以執行個體對象作為其第一個參數,一般以名為'self'的變量作為第一個參數(當然可以以其他名稱的變量作為第一個參數)。在類外執行個體方法隻能通過執行個體對象去調用,不能通過其他方式去調用。

  靜态方法:需要通過修飾器"@staticmethod"來進行修飾,靜态方法不需要多定義參數。

  對于類屬性和執行個體屬性,如果在類方法中引用某個屬性,該屬性必定是類屬性,而如果在執行個體方法中引用某個屬性(不作更改),并且存在同名的類屬性,此時若執行個體對象有該名稱的執行個體屬性,則執行個體屬性會屏蔽類屬性,即引用的是執行個體屬性,若執行個體對象沒有該名稱的執行個體屬性,則引用的是類屬性;如果在執行個體方法更改某個屬性,并且存在同名的類屬性,此時若執行個體對象有該名稱的執行個體屬性,則修改的是執行個體屬性,若執行個體對象沒有該名稱的執行個體屬性,則會建立一個同名稱的執行個體屬性。想要修改類屬性,如果在類外,可以通過類對象修改,如果在類裡面,隻有在類方法中進行修改。

  從類方法和執行個體方法以及靜态方法的定義形式就可以看出來,類方法的第一個參數是類對象cls,那麼通過cls引用的必定是類對象的屬性和方法;而執行個體方法的第一個參數是執行個體對象self,那麼通過self引用的可能是類屬性、也有可能是執行個體屬性(這個需要具體分析),不過在存在相同名稱的類屬性和執行個體屬性的情況下,執行個體屬性優先級更高。靜态方法中不需要額外定義參數,是以在靜态方法中引用類屬性的話,必須通過類對象來引用。

  關于面向對象程式設計暫時就講這麼多了,其他關于類的繼承和方法重載這些内容将在後面繼續講解。

本文轉載自海 子部落格園部落格,原文連結:http://www.cnblogs.com/dolphin0520/archive/2013/03/29/2986924.html如需轉載自行聯系原作者