1. 程式人生 > >[Python]學習基礎篇:面向對象編程

[Python]學習基礎篇:面向對象編程

必須 outline func pad order ola 項目設計 tom return

面向對象編程

是種具有對象概念的程序編程典範,同時也是一種程序開發的抽象方針。它可能包含數據、屬性、代碼與方法。對象則指的是類的實例。它將對象作為程序的基本單元,將程序和數據封裝其中,以提高軟件的重用性、靈活性和擴展性,對象裏的程序可以訪問及經常修改對象相關連的數據。在面向對象程序編程裏,計算機程序會被設計成彼此相關的對象。
面向對象程序設計可以看作一種在程序中包含各種獨立而又互相調用的對象的思想,這與傳統的思想剛好相反:傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。面向對象程序設計中的每一個對象都應該能夠接受數據、處理數據並將數據傳達給其它對象,因此它們都可以被看作一個小型的“機器”,即對象。目前已經被證實的是,面向對象程序設計推廣了程序的靈活性和可維護性,並且在大型項目設計中廣為應用。此外,支持者聲稱面向對象程序設計要比以往的做法更加便於學習,因為它能夠讓人們更簡單地設計並維護程序,使得程序更加便於分析、設計、理解。反對者在某些領域對此予以否認。

我們提到面向對象的時候,它不僅指一種程序設計方法。它更多意義上是一種程序開發方式。在這一方面,我們必須了解更多關於面向對象系統分析和面向對象設計(Object Oriented Design,簡稱OOD)方面的知識。許多流行的編程語言是面向對象的,它們的風格就是會透由對象來創出實例。

class

類:用來描述具有相同屬性和方法的對象的集合,類定義了集合中每個對象共有的屬性和方法。

  • 類的定義
    對於類的定義,不同的語言有自己不同的定義方式,在python中類的定義比較簡單,如下:
    格式:

class  class_name(object):
        def  func(self):
            pass        
            ...

無論在java還是python中每個類都有自己的父類,一般沒有指明的情況下,定義的類默認為object的子類。
對於類的方法的定義,每個方法都需要定義一個self參數,在調用類方法時,不需要給self傳值,這個相當於java或者c++中的this指針,self區別了類方法和不同方法。

  • 類的訪問權限
    對於類中屬性和方法,都有私有和共有的區別,那麽什麽是私有什麽是共有呢?
    私有屬性/方法:是指外部方法不能夠調用的屬性/方法
    共有屬性/方法:是指可以通過外部方法訪問的屬性/方法
    私有屬性的定義:
    格式:

class class_name(object):
     __prive=2312

其實私有變量的定義格式很簡單,就是在變量前面加兩個下劃線

(__)。
私有方法的定義:
格式:

class class_name(object):
     def __prive_func(self):
        ....

私有方法的定義和私有屬性的定義一樣,在前面加兩個下劃線(__)

  • 類的專有方法
    (1).構造函數
    什麽是構造方法:
    構造方法是一個特殊的沒有返回值的方法,對象的創建就是通過構造方法來完成,其功能主要是完成對象的初始化。當類實例化一個對象時會自動調用構造方法。
    格式:

class class_name(object):
     def __init__(self):
        ....

當一個類沒有編寫構造函數時,當創建對象時會自動調用系統默認的構造方法。
(2).析構函數
什麽是析構函數?
析構函數(destructor) 與構造函數相反,當對象結束其生命周期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。析構函數往往用來做“清理善後” 的工作。
格式:

class class_name(object):
     def __init__(self):
        ....     
     def __del__(self):
        ...

(3).get__score(self)函數
此函數是Python專用來訪問類的私有屬性的方法,對於類我們進行封裝,但是有時我們必須訪問類中有些私有屬性,這是在類中定義此方法可以返回私有變量。
格式:

class class_name(object):
     def __init__(self,name):
        self.__name=name     
    def get__score(self):
         return self__name     
    def __del__(self):
        ...

(4).set__attrs(self,bian)函數
對於私有變量我們不能通過一般方法進行方法,那麽更改私有變量的值,那麽那簡直是天方夜譚。Python為我們提供了set__attrs()方法,此方法用來在外部改變私有變量的值。
格式:

class class_name(object):
     def __init__(self,name):
        self.__name=name     
     def get__score(self):
         return self__name    
     def set__attrs(self,name):
         self.__name=name     
     def __del__(self):
        ...
  • 類的實例化
    前邊我們介紹了類的一些方法和定義形式,那麽怎麽才能創建一個類的對象進行實例化呢?其實這個很簡單,如下:
    格式:
    變量=類名(參數)

class class_name(object):
     def __init__(self,name):
        self.__name=name     
     def get__score(self):
         return self__name    
     def set__attrs(self,name):
         self.__name=name    
     def __del__(self):
        ...
bian=calss_name('python')
print(bian.get__score())
bian.set_attrs('java')
print(bian.get__score())

運行結果:
python
java
  • 類的特性
    對於每一種面向對象編程而言,都有三大特征封裝,繼承,多態。下來我們一一介紹。

  • 封裝
    封裝是全局作用於中的其他區域隱藏多余信息的原則,封裝不同於多態,多態可以讓用戶對不知道類的對象進行方法調用,而封裝可以不用關心對象是如何構建,直接使用即可

  • 單繼承
    繼承是指子類繼承父類的屬性和方法,而達到代碼公用的目的。
    特點:
    (1):在繼承中,基類的構造方法不會被自動調用,需要在子類的構造方法中專門調用。
    (2):在調用基類的發放時需要加上基類的類名前綴,並帶上self參數變量。區別於在類中調用普通函數不需要self參數。
    (3):在Python中,首先查找對應類型的方法,如果在子類中找不到對應的方法,則在基類中一個一個查找。
    格式:class class_name(fatherclass):
    如:

class man(object):
    def __init__(self,name,sex):
        self.name=name
        self.sex=sexclass student(man):
    def __init__(self,name,sex,class1):
        self.name=name
        self.sex,class1=class1
此時student繼承了man這個類,man的屬性和方法student類的對象都可以調用,除了私有屬性和方法。

重寫
子類不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。
如:

class man(object):
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex   
    def speak(self,language):
        self.language=language
        print(language)
class student(man):
    def __init__(self,name,class1):
        self.name=name
        self.class1=class1    
     def speak(self,language):         #子類的speak方法重寫了基類的speak方法
        printf("%s同學說的是%s",slef.name,self.language)

重載
重載是讓類以統一的方式處理不同類型數據的一種手段。是在一個類裏面,方法名字相同,而參數不同。返回類型呢?可以相同也可以不同。
特點:
(1):可變參數類型
(2):可變參數個數
如:

class man(object):
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex    
    def speak(self,language):
        self.language=language
        print("%s同學說的是%s",slef.name,self.language)
class student(man):
    def __init__(self,name,class1):
        self.name=name
        self.class1=class1    
    def speak(self,language,num):         #重載
        printf("%s同學說的是%s",slef.name,self.language)
  • 多繼承
    對於繼承,java只支持單繼承,而python支持多繼承。
    註意:在python中對於多繼承,若基類中有相同的方法名,在子類使用時未指定那個基類的方法,則從繼承關系中從左到右依次查找。
    格式:
    cless class_name(class1,class2,class3….)

  • 多態
    在面向對象語言中,接口的多種不同的實現方式即為多態。多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。


[Python]學習基礎篇:面向對象編程