python 面向對象、類、對象

class 類
object 對象
object-oriented programming 面向對象,簡稱OOP
attribute 屬性
method 方法
inheritance 繼承

python中通過類和對象來實現 面向對象的編程
面向對象編程,最重要、主要的目的是:提高程序的重複使用性,這和函數的目的類似
python中一切皆對象,類也是對象


類是屬性相近對象的歸類
在人類認知中,會根據屬性相近把‘東西歸類,並且給類別命名
比如鳥類共同屬性是有羽毛,通過產卵生育後代。任何一隻特別的鳥都是建立在鳥類的原型基礎上
面向對象就是模擬了以上人類認知的過程。在python中,上述的東西稱爲對象

定義鳥類 

  1. class Bird(object):#類,鳥;類  
  2.     have_feather = True#變量,羽毛;屬性  
  3.     way_of_reproduction  = 'egg'#變量,生殖方式;屬性  

定義類,名字鳥
該‘類別’中定義變量,1是否有羽毛,2生殖方式
這2個變量對應我們之前所說的屬性

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

  1. summer = Bird()#創建對象,初始化類 
  2. print summer.way_of_reproduction#調用類屬性 

第一句賦值語句,創建了對象並說明summer是類中的一個對象, summer就有了鳥的類屬性'
對屬性的引用是通過 對象.屬性(object.attribute)的形式來實現


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

python中,這樣的屬性稱爲方法。python中通過在’類內部定義函數’,來說明方法

  1. class Bird(object): 
  2.     have_feather = True 
  3.     way_of_reproduction = 'egg' 
  4.     def move(self, dx, dy):#屬性,表現:類的函數 
  5.         position = [0,0
  6.         position[0] = position[0] + dx 
  7.         position[1] = position[1] + dy 
  8.         return position 
  9.  
  10. summer = Bird() 
  11. print 'after move:',summer.move(5,8)#調用類的函數(方法) 

單獨函數稱爲普通函數,簡稱函數
類的函數(其實也是類的屬性,只不過是一個特殊的屬性),被稱爲類的方法,簡稱方法
(括號中的object,當括號中爲object時,說明這個類沒有父類(到頭了))

該處,類’鳥‘新增一個屬性,即移動(類的函數move)
(函數/方法有一個參數self,是爲了方便引用對象自身,函數/方法也是對象),函數/方法的第一個參數必須爲self,無論是否用到
另外2個參數,dx dy表示在2個方向移動的距離,move方法會最終返回運算過的position
另外調用move方法時,只傳遞了dx dy的值,不需要傳遞self參數(因爲slef參數只是爲了內部使用)



3 類別本身還可以進一步細分成子類
比如說,鳥類可以進一步分成雞,大雁,黃鸝
在OOP中,我們通過繼承來表達上述概念

  1. class Chicken(Bird):#類,雞;類;繼承基/父類‘鳥’  
  2.     way_of_move = ‘walk’#變量,移動方式;屬性  
  3.     possible_in_KFC = True  
  4.   
  5. class Oriole(Bird):#類,黃鸝;類;繼承基/父類‘鳥’  
  6.     way_of_move = 'fly'  
  7.     possible_in_KFC = False  
  8.   
  9. summer = Chicken()  
  10. print summer.have_feather#調用基/父類屬性  
  11. print 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)類,同樣繼承自鳥類。這樣,我們在有一個屬於黃鸝的對象時,也會自動擁有鳥類的屬性

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

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

 

總結:
將東西根據屬性歸類 ( 將object歸爲class )
方法是一種屬性,表示動作
用繼承來說明父類-子類關係。子類自動具有父類的所有屬性。
self代表了根據該類定義而創建的對象。

建立對一個對象: 對象名 = 類名()
引用對象的屬性: object.attribute

作者:Vamei 出處:http://www.cnblogs.com/vamei 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章