一、概述
python作爲一門高級語言,也是面向對象的,在學習面向過程編程中,我們會很據業務需要自上而下進行編寫代碼,進一步發現這樣會導致大量代碼重用,所以我們改用函數式編程,將代碼封裝在一個函數中,日後便不需要重複寫代碼,只需要調用即可。我們都知道,在python中,一切都是對象,對象都是由類來創建的,爲了以後讓我們的開發越快越強越好,我們必須掌握面向對象編程。
二、概念(oop編程)
1、面向對象:將函數進行分類和封裝,讓開發變得perfect。
2、面向對象並不神祕,它只是一種編程方式,是對“對象”和“類”的使用,然而類就是一個模板,裏面 包含很多函數,函數裏實現功能(在類中將函數叫做方法),而對象是根據類創建的實例,根據實例對 象可以執行類中的方法。
3、創建類:
class province: #創建類 def shanxi(self): print "山西" def henan(self,name): print "%s 是河南的省會" %name obj = province() #根據類創建對象 obj.shanxi() #執行shanxi方法 obj.henan("鄭州")#執行henan方法
class是關鍵字,表示類
創建對象類名後面直接加括號即可
小結:
可以看出面向對象編程是通過創建對象,對象調用方法來執行,而函數式編程是通過執行函數
三、面向對象之三大特性
面向對象三大特性:封裝、繼承、多態
對於python的面向對象來說,不支持多態也用不到多態,所以我們就一心一意學python的封裝和繼承就好
1、封裝
封裝:就是把內容封裝在某個地方,等用的時候再去調用,即1、將內容封裝到某處,2、在某處調用封裝的 內容
下面詳解介紹如何操作:
第一步:將內容封裝到某處
class Foo: #創建類Foo def __init__(self,name,age): #稱爲析構方法,根據類創建對象時自動執行, self.name = name self.age = age #根據類Foo創建對象obj,自動執行__init__方法 #將"tom"和18封裝在obj的name和age屬性中。 obj = Foo("tom",18)
解釋self:
self是一個形式參數,當執行obj = Foo("tom",18)時,self等於obj,指的是變量本身,按照慣例稱之爲self
第二步:從某處調用被封裝的內容
調用有兩種方式
1、用創建的對象直接調用
實例:調用方法爲對象.屬性名。例如:obj.name,obj.age
class Foo: #創建類Foo def __init__(self,name,age): #稱爲析構方法,根據類創建對象時自動執行, self.name = name self.age = age #根據類Foo創建對象obj,自動執行__init__方法 #將"tom"和18封裝在obj的name和age屬性中。 obj = Foo("tom",18) print obj.name #用創建的對象obj直接調用屬性name print obj.age #用創建的對象obj直接調用屬性age
2、用self間接調用
執行類中的方法時通過self間接調用被封裝的內容
class Foo: #創建類Foo def __init__(self,name,age): #稱爲析構方法,根據類創建對象時自動執行, self.name = name self.age = age def hello(self): print self.name print self.age #根據類Foo創建對象obj,自動執行__init__方法 #將"tom"和18封裝在obj的name和age屬性中。 obj = Foo("tom",18) print obj.name #用創建的對象obj直接調用屬性name print obj.age #用創建的對象obj直接調用屬性age obj.hello() #python會默認將obj傳給self參數,即obj.hello(obj),內部變爲self=obj, self.name="tom",self.age=18
總結:
面向對象的封裝就是使用構造方法將內容封裝到對象中,然後通過對象直接或者採用self間接獲取被封裝的內容。
2、繼承
在python中的繼承也是子繼承父(專業術語,基類和派生類)
對於面向對象的繼承,就是將多個類共同的方法提取到父類中,子類只需繼承父類即可,從而減少子類一一去實現每個方法。
對於python與其它語言不同的是,python支持多繼承
而多繼承是怎麼實現的呢?以及有哪些注意的事項呢?
先介紹兩個概念:經典類和新式類
從一般寫法上區別:如果當前類或者父類繼承了object類,那麼就是新式類,反之就是經典類。舉例爲:
這樣一來繼承的方式就不一樣了
經典類多繼承服從深度優先,而新式類多繼承服從廣度優先。麻煩來了,何爲深度優先和廣度優先,畫圖表示爲:
經典類多繼承用代碼表示爲:
class D: def hello(self): pass class C(D): def hello(self): pass class B(D): def hello(self): pass class A(B,C): pass obj = A() obj.hello()
執行obj.hello()時,先在A類中找,若沒有,再去B類中找,若沒有再去D類中找,若沒有再去C類中找,若C中也沒有,就直接報錯。在查找過程中,如果找到就不再繼續找了,就中斷了。
順序爲A-->B----D---->C,
新式類多繼承代碼爲:
class D(object): def hello(self): pass class C(D): def hello(self): pass class B(D): def hello(self): pass class A(B,C): pass obj = A() obj.hello()
執行obj.hello()時,先從A類中找,若沒有在B類中找,若沒有再C類中,若沒有D類中找,若沒有直接報錯。在查找過程中,如果找到就不再繼續找了,就中斷了。
執行順序爲:A-->B----C---->D
用幾個小問題總結一下面向對象的知識
1)什麼樣的代碼纔是面向對象?
答:程序中的所有功能都是用類和對象實現的代碼,一般在實際編程中,都是和函數式編程混合使用的。
2)面向對象的應用場景
1、多函數使用相同的值,例如,數據庫的增刪改查操作都需要連接數據庫字符串、主機名、用戶名和密碼
2、需要創建多個事物,每個事物屬性個數相同。
3)類和對象在內存中是如何保存的?
類以及類中的方法在內存中都只有一份,而根據類創建的對象在內存中都要每存一份,如下圖所示:
以上就是初步對面向對象編程的簡單認識,在這裏感謝武sir在網絡教學中的詳細講解以及武sir的博客
http://www.cnblogs.com/wupeiqi/p/4493506.html