python學習----------面向對象1

一、概述

    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中的繼承也是子繼承父(專業術語,基類和派生類)

對於面向對象的繼承,就是將多個類共同的方法提取到父類中,子類只需繼承父類即可,從而減少子類一一去實現每個方法。

wKioL1aXGNuCaQppAAAtEbFd-vc010.png

對於python與其它語言不同的是,python支持多繼承

而多繼承是怎麼實現的呢?以及有哪些注意的事項呢?

先介紹兩個概念:經典類和新式類

從一般寫法上區別:如果當前類或者父類繼承了object類,那麼就是新式類,反之就是經典類。舉例爲:

wKiom1aXG7_g9hURAAAj9fLWx2Y268.pngwKioL1aXHAjQJYszAAAmAMpkGYU999.png

這樣一來繼承的方式就不一樣了

經典類多繼承服從深度優先,而新式類多繼承服從廣度優先。麻煩來了,何爲深度優先和廣度優先,畫圖表示爲:

wKioL1aXHhCwX6bGAAAd0iza28A430.png

wKiom1aXHfPTT4m0AAAcLLo4mNw082.png

經典類多繼承用代碼表示爲:

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)類和對象在內存中是如何保存的?

類以及類中的方法在內存中都只有一份,而根據類創建的對象在內存中都要每存一份,如下圖所示:

wKiom1aXO8jAd2k-AAAvICFA2ek986.png

以上就是初步對面向對象編程的簡單認識,在這裏感謝武sir在網絡教學中的詳細講解以及武sir的博客

http://www.cnblogs.com/wupeiqi/p/4493506.html


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