1. 程式人生 > >python 面向物件程式設計

python 面向物件程式設計

一、面向物件程式設計方法的由來

1、面向過程的程式設計方法

1.1基本步驟

  • 分析程式從輸入到輸出的各步驟
  • 按照執行過程從前到後編寫程式
  • 將高耦合部分封裝成模組或函式
  • 輸入引數,按照程式執行過程除錯 

1.2 面向過程的程式設計特點

過程化程式設計的典型方法是“結構化程式設計”方法,是由荷蘭學者Dijkstra在70年代提出的。 程式設計原則:自上而下、逐步求精、模組化程式設計等。

程式結構如下:

  • 按功能劃分為若干個基本模組。
  • 各模組間的關係儘可能簡單,功能上相對獨立;
  • 每一模組內部均是由順序、選擇和迴圈三種基本結構組成。
  • 其模組化實現的具體方法是使用子程式(過程/函式)

程式組成:由傳遞引數的函式集合組成,每個函式處理它的引數,並可能返回某個值。即:主模組+子模組,它們之間以資料作為連線(程式=演算法+資料結構)。

程式特點:程式是以過程為中心的。程式設計師必須基於過程來組織模組。資料處於次要的地位,而過程是關心的重點。

優點:有效地將一個較複雜的程式系統設計任務分解成許多易於控制和處理的子任務,便於開發和維護。

1.3 面向過程的程式設計的缺點

  • 資料與處理資料相隔離

一旦問題(資料)改變,程式設計師則需要改寫或重新編寫新的解決方法(功能函式),有時幾個關鍵的資料結構發生變化,將導致整個軟體系統的結構崩潰。隨著軟體規模和複雜性的增長,這種缺陷日益明顯。當程式達到一定規模後,為了修改一個小的錯誤,常可能引出多個大的錯誤,究其原因,問題就出在傳統的程式設計方式上。一般適用於中小型的程式設計及程式設計應用。

  • 管理的資料型別無法滿足需求

當前的軟體應用領域已從傳統的科學計算和事務處理擴充套件到了其它的很多方面,如人工智慧、計算機輔助設計和輔助製造等,所需處理的資料也已從簡單的數字和字串發展為記錄在各種介質上並且有多種格式的多媒體資料,如數字、正文、圖形、聲音和影像等。資料量和資料型別的空前激增導致了許多程式的規模和複雜性均接近或達到了用結構化程式設計方法無法管理的程度。

  • 可重用性差

只能以函式的方式實現程式碼重用,效率低,是手工作坊式的程式設計模式。作為軟體公司,都希望設計的程式具有可重用性,即能否建立一些具有已知特性的部件,應用程式通過部件組裝即可得到一個新的系統;

#求解鉛球的飛行距離
from math import pi,sin,cos,radians
#根據提示輸入模擬引數
def getInputs():
    angle=eval(input("Enter the launch angle(in  degree):"))
    vel=eval(input('Enter the initial velocity(in meters/sec):'))
    h0=eval(input('Enter the initial height(in meter):'))
    time=eval(input('Enter the time interval:'))
    return anglle,vel,h0,time

def getXYComponents(vel,angle):
    theta=radians(angle)
    xvel=vel*cos(theta)
    yvel=vel*sin(theta)
    return xvel,yvel

def updatePosition(time,xpos,ypos,xvel,yvel):
    xpos=xpos+time*xvel
    yvell=yvel-time*9.8
    ypos=ypos+time*(yvell+yvel)/2
    yvel=yvell
    return xpos,ypos,yvel


def main():
    angle,vel,h0,time=getInputs()
    xpos,ypos=0,h0
    xvel,yvel=getXYConponents(vel,angle)
    while ypos>=0:
        xpos,ypos,yvel=updatePosition(time,xpos,ypos,xvel,yvel)
        print('\Dnistance traveled:(0:0.1f) meter.'.format(xpos))
    

2、面向物件程式設計方法

面向物件程式設計是一種組織程式的新型思維方式,軟體設計的焦點不再是程式的邏輯流程,而是軟體或程式中的物件以及物件之間的關係。

  • 將資料及對資料的操作方法封裝在一起,作為一個相互依存、不可分離的整體——物件。
  • 對同類型物件抽象出其共性,形成類。
  • 類通過一個簡單的外部介面,與外界發生關係。
  • 物件與物件之間通過訊息進行通訊。

面向物件程式設計方法優點:

程式模組間的關係更加簡單,程式模組的獨立性、資料的安全性就更有了良好的保障;

通過繼承和多型性,可以大大t提高程式的可重用性、使得軟體的開發和維護都更為方便。

3.、python 支援的程式設計方式

python支援面向過程、面向物件、函數語言程式設計等多種程式設計方式;

Python不強制使用任何一種程式設計方式,可以使用面向過程方式編寫任何程式,在編寫小程式(少於500行程式碼)時,不會有問題。但對於中等和大型專案來說,面向物件會帶來很多優勢。

Python對面向物件的語法進行了簡化,去掉了面向物件中許多複雜的特性。例如,類的屬性和方法的限制符—public、private、protected。

Python提倡語法的簡單、易用性,這些訪問許可權靠程式設計師自覺遵守,而不強制使用。

二、類和物件

 

2.1類的定義

Python使用class關鍵字定義一個類,類名首字元一般要大寫。

當需要建立的型別不能用簡單型別(內建型別)來表示時,則需要定義類,然後利用定義的類建立物件。

格式:    class Class_name(object):

# 建立一個person 類
class Person(object):
    def __init__(self):#類的建構函式,用來初始化物件
        self.name=''
        self.age=0
    
    def display(self): #類中定義的函式也稱方法
        print('Person(%s,%d)'%(self.name,self.age))

obj1=Person()
obj1.name='lihaniey '
obj1.age=18
obj1.display()
    

輸出結果:

Person(lihaniey ,18)

當定義一個類時,如果這個類沒有任何父類,則將object設定為它的父類,用這種方式定義的類屬於新式類。如果定義的類沒有設定任何父類,則這種方式定義的類屬於經典類。建議使用新式類,新式類將類與內建型別進行了統一。

新式類與經典類在多重繼承問題中有一個重要的區別:對於經典類,繼承順序是採用深度優先的搜尋演算法,對於新式類,繼承順序是採用廣度優先的搜尋演算法。

self是指向物件本身的變數,類似於C++的this指標。Python要求,類內定義的每個方法的第一個引數是self,通過例項呼叫時,該方法才會繫結到該例項上。