那些年被我坑過的Python——玄而又玄(第六章 面向對象編程基礎)

面向對象編程:html

  面向對象顧名思義,就是把組織代碼的粒度從函數級別抽象到對象級別,對象是經過類來生成的,類能夠想象爲模板或進本框架而對象是在原有模板或框架的基礎上增長詳細信息的實體,類,有分類、聚類的含義,也就是說把世間萬物進行區分,有相同特色的找到這些相同點構成一個模板,以備從此使用。實例化就是從類生成對象的過程。  python

  類的三大特性:程序員

  封裝、繼承和多態編程

    封裝:編程的根本結果是實現了數據的組織、傳遞、轉換與呈現,面向對象編程中,對數據的存放和傳遞進行了抽象,數據再也不以單點存在,而是保存在對象中,傳遞的媒介就成了對象,這樣是把一組相互關聯的數據放在一塊兒,並構建起內部的變換關係,在使用過程當中,程序員沒必要過多考慮數據是什麼,更多的是考慮對象有什麼屬性和方法。框架

    繼承:除了類別之間的關係,還有類別以內的細分,繼承的本意就是把核心的共同點保留下來,不用再從新編寫,實現了類級的重用函數

    多態:實現了對類中接口的重用,簡單來講就是對外調用的接口不變,可是接口內在的邏輯能夠不一樣。this

定義一個類能夠採用下面的方式來定義:spa

class className(object): foo
   bar

  注意類名後面有個冒號,在block塊裏面就能夠定義屬性和方法了。當一個類定義完以後,就產生了一個類對象。類對象支持兩種操做:引用和實例 化。引用操做是經過類對象去調用類中的屬性或者方法,而實例化是產生出一個類對象的實例,稱做實例對象。好比定義了一個people類:指針

class people(object): name = 'jack' #定義了一個屬性 #定義了一個方法 def printName(self): print people.name

  people類定義完成以後就產生了一個全局的類對象,能夠經過類對象來訪問類中的屬性和方法了。當經過people.name(至於爲何可 以直接這樣訪問屬性後面再解釋,這裏只要理解類對象這個概念就好了)來訪問時,people.name中的people稱爲類對象,這點和C++中的有所 不一樣。固然還能夠進行實例化操做,p=people( ),這樣就產生了一個people的實例對象,此時也能夠經過實例對象p來訪問屬性或者方法了(p.name).code

  理解了類、類對象和實例對象的區別以後,咱們來了解一下Python中屬性、方法和函數的區別。

  在上面代碼中註釋的很清楚了,name是一個屬性,printName( )是一個方法,與某個對象進行綁定的函數稱做爲方法。通常在類裏面定義的函數與類對象或者實例對象綁定了,因此稱做爲方法;而在類外定義的函數通常沒有同對象進行綁定,就稱爲函數。

二.屬性

  在類中咱們能夠定義一些屬性,好比:

class people(): name = 'jack' age = 12 p = people() print p.name,p.age

私有屬性

  定義了一個people類,裏面定義了name和age屬性,默認值分別爲'jack'和12。在定義了類以後,就能夠用來產生實例化對象了, 這句p = people( )實例化了一個對象p,而後就能夠經過p來讀取屬性了。這裏的name和age都是公有的,能夠直接在類外經過對象名訪問,若是想定義成私有的,則需在前 面加2個下劃線 ' __'。

class people: __name = 'jack' __age = 12 p = people() print p.__name,p.__age

  這段程序運行會報錯:

  

  提示找不到該屬性,由於私有屬性是不可以在類外經過對象名來進行訪問的。在Python中沒有像C++中public和private這些關鍵 字來區別公有屬性和私有屬性,它是以屬性命名方式來區分,若是在屬性名前面加了2個下劃線'__',則代表該屬性是私有屬性,不然爲公有屬性(方法也是一 樣,方法名前面加了2個下劃線的話表示該方法是私有的,不然爲公有的)。

三.方法和私有方法

  在類中能夠根據須要定義一些方法,定義方法採用def關鍵字,在類中定義的方法至少會有一個參數,,通常以名爲'self'的變量做爲該參數(用其餘名稱也能夠),並且須要做爲第一個參數。下面看個例子:

複製代碼
class people: __name = 'jack' __age = 12 def getName(self): return self.__name def getAge(self): return self.__age p = people() print p.getName(),p.getAge()
複製代碼

  

  若是對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++中類的靜態成員變量有點相似。對於公有的類屬性,在類外能夠經過類對象和實例對象訪問。

複製代碼
class people: name = 'jack' #公有的類屬性 __age = 12 #私有的類屬性  p = people() print p.name #正確 print people.name #正確 print p.__age #錯誤,不能在類外經過實例對象訪問私有的類屬性 print people.__age #錯誤,不能在類外經過類對象訪問私有的類屬性
複製代碼

  實例屬性是不須要在類中顯示定義的,好比:

複製代碼
class people: name = 'jack' p = people() p.age =12 print p.name #正確 print p.age #正確 print people.name #正確 print people.age #錯誤
複製代碼

  在類外對類對象people進行實例化以後,產生了一個實例對象p,而後p.age = 12這句給p添加了一個實例屬性age,賦值爲12。這個實例屬性是實例對象p所特有的,注意,類對象people並不擁有它(因此不能經過類對象來訪問 這個age屬性)。固然還能夠在實例化對象的時候給age賦值。

複製代碼
class people: name = 'jack' #__init__()是內置的構造方法,在實例化對象時自動調用 def __init__(self,age): self.age = age p = people(12) print p.name #正確 print p.age #正確 print people.name #正確 print people.age #錯誤
複製代碼

  若是須要在類外修改類屬性,必須經過類對象去引用而後進行修改。若是經過實例對象去引用,會產生一個同名的實例屬性,這種方式修改的是實例屬 性,不會影響到類屬性,而且以後若是經過實例對象去引用該名稱的屬性,實例屬性會強制屏蔽掉類屬性,即引用的是實例屬性,除非刪除了該實例屬性。

複製代碼
class people(): country = 'china' print people.country p = people() print p.country p.country = 'japan' print p.country #實例屬性會屏蔽掉同名的類屬性 print people.country del p.country #刪除實例屬性 print p.country
複製代碼

  

相關文章
相關標籤/搜索