Python基礎08 物件導向的基本概念

來源:互聯網
上載者:User

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

謝謝逆水寒龍,topmad和Liqing錯誤修正

 

(物件導向並不難,不要被“物件導向”嚇跑)

Python中通過使用類(class)和對象(object)來實現物件導向(object-oriented programming,簡稱OOP)的編程。

物件導向編程的最主要目的是提高程式的重複使用性,這和函數的目的相類似。

我們這麼早切入物件導向編程的原因是,Python的整個概念是基於對象的。瞭解OOP對於我們深入瞭解Python很關鍵。

下面是我對物件導向的理解。

 

1. 類是屬性相近的對象的歸類

在人類認知中,會根據屬性相近把東西歸類,並且給類別命名。比如說,鳥類的共同屬性是有羽毛,通過產卵生育後代。任何一隻特別的鳥都在鳥類的原型基礎上的。

物件導向就是類比了以上人類認知過程。在Python語言,為了聽起來酷,我們把上面說的“東西”稱為對象(object)。

先定義鳥類

class Bird(object):    have_feather = True    way_of_reproduction  = 'egg'

我們定義了一個類別(class),就是鳥(Bird)。在隸屬於這個類比的語句塊中,我們定義了兩個變數,一個是有羽毛(have_feather),一個是生殖方式(way_of_reproduction),這兩個變數對應我們剛才說的屬性(attribute)。我們暫時先不說明括弧以及其中的內容,記為問題1。

假設我養了一隻小雞,叫summer。它是個對象,屬於鳥類。使用前面定義的類。

summer = Bird()print summer.way_of_reproduction

通過第一句建立對象,並說明summer是類別鳥中的一個對象,summer就有了鳥的類屬性,對屬性的引用是通過 對象.屬性(object.attribute) 的形式實現的。

(可憐的summer,你就是個有毛產蛋的東西,好不精緻)

 

2. 屬性可以是變數,也可以是動作(方法)。

在人類日常認知中,我們在通過屬性識別類別的時候,有時候會根據這個東西能做什麼事情來區分類別。比如說,鳥會移動 (這樣就和房屋的類別區分開了)。而這些動作又會帶來一定的結果,通過移動會帶來位置的變化。

為了酷起見,我們叫這樣的一些屬性為方法(method)。Python中通過在類的內部定義函數,來說明方法。

class Bird(object):
   have_feather = True
    way_of_reproduction = 'egg'
def move(self, dx, dy): position = [0,0]
position[0] = position[0] + dx position[1] = position[1] + dy
return position

summer = Bird()print 'after move:',summer.move(5,8)

我們重新定義了鳥這個類別。

鳥新增一個方法屬性,就是移動(函數move)。(我承認這個方法很傻,你可以在看過下一講之後定義個有趣些的方法)

(它的參數中有一個self,它是為了方便我們引用對象自身。方法的第一個參數必須是self,無論是否用到。有關self的內容會在下一講展開)

另外兩個參數,dx, dy表示在x、y兩個方向移動的距離。move方法會最終返回運算過的position。

在最後調用move方法的時候,我們只傳遞了dx和dy兩個參數,不需要傳遞self參數(因為self只是為了內部使用)。

(我的summer現在可以跑一下了)

 

3. 類別本身還可以進一步細分成子類

比如說,鳥類可以進一步分成雞,大雁,黃鸝。

在OOP中,我們通過繼承(inheritance)來表達上述概念。

class Chicken(Bird):    way_of_move = 'walk'    possible_in_KFC = Trueclass Oriole(Bird):    way_of_move = 'fly'    possible_in_KFC = Falsesummer = Chicken()print summer.have_featherprint summer.move(5,8)

我們新定義的雞(Chicken)類的,新增加了兩個屬性,移動方式(way_of_move)和可能在KFC找到(possible_in_KFC)

在類定義時,括弧裡改為了Bird,用來說明,Chicken是屬於鳥類(Bird)的一個子類(酷點的說法,Chicken繼承自Bird),而自然而然,Bird就是Chicken的父類。通過這個說明,Python就知道,Chicken具有Bird的所有屬性。我們可以看到,儘管我只聲明了summer是雞類,它依然具有鳥類的屬性(無論是變數屬性have_feather還是方法屬性move)

另外定義黃鸝(Oriole)類,同樣繼承自鳥類。這樣,我們在有一個屬於黃鸝的對象時,也會自動擁有鳥類的屬性。

通過繼承製度,我們可以避免程式中的重複資訊和重複語句。如果我們分別定義兩個類,而不繼承自鳥類,那麼我們就必須把鳥類的屬性分別敲到雞類和黃鸝類的定義中,累啊。

(回到問題1, 括弧中的object,當括弧中為object時,說明這個類沒有父類(到頭了))

所以說,物件導向提高了程式的可重複使用性。

我們可以看到,物件導向實際上基於人類認知時的習慣,將各種各樣的東西分類,從而瞭解世界。我們從祖先開始可能已經練習了這個認知過程有幾百萬年,所以物件導向是很符合人類思維習慣的編程方法。所謂面向過程(也就是執行完一個語句再執行下一個)實際上是機器思維。通過物件導向的編程,我們實際上是更貼近我們自然的思維方式,也更方便和其他人交流我們程式裡所包含的想法,甚至於那個人並不是程式員。

 

總結:

將東西根據屬性歸類 ( 將object歸為class )

方法是一種屬性,表示動作

用繼承來說明父類-子類別關係。子類自動具有父類的所有屬性。

self代表了根據該類定義而建立的對象。

定義類:

class class_name(parent_class):    a = ...    b = ...    def method1():        ...    def method2():        ...

建立對一個對象: 對象名 = 類名()

引用對象的屬性: object.attribute

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.