Python面向對象編程系列(一)

       Python不只是解釋性語言,也是一門面向對象的編程語言,因此自定義對象是Python語言的核心之一。類使得程序設計更加抽象,通過類的繼承及其他常用方法,可以讓程序語言更接近人類的語言。

Python面向對象編程系列之學習目標

(1) 瞭解面向對象編程的發展、實例、優點。

(2) 瞭解使用面向對象編程的情形。

(3) 掌握類的定義、使用和專有方法。

(4) 掌握self參數的使用。

(5) 掌握對象的創建(實例化)、刪除。

(6) 掌握對象的屬性、方法引用和私有化方法。

(7) 掌握迭代器和生成器。

(8) 掌握類的繼承、重載、封裝等其他方法。

1. 面向對象編程

       面向對象編程(Object Oriented Programming,OOP)即面向對象程序設計。類和對象是OOP中的兩個關鍵內容,在面向對象編程中,以類來構造現實世界中的事物情景,再基於類創建對象來進一步認識、理解、刻畫。根據類來創建的對象,每個對象都會自動帶有類的屬性和特點,然後可以按照實際需要賦予每個對象特有的屬性,這個過程被稱爲類的實例化。

       抽象的直接表現形式通常爲類。抽象指對現實世界的事物,行爲和特徵建模,建立一個相關的數據集用於描繪程序結構,從而實現這個模型。抽象不僅包括這種模型的數據屬性,還定義了這些數據的接口。從面向對象設計(Object Oriented Design,簡稱OOD)角度去看,如果類是從現實對象抽象而來的,那麼抽象類就是基於類抽象而來的,可以進行相似編碼,或者編入與對象交互的對象中。從實現角度來看,抽象類與普通類的不同之處在於:抽象類中只能有抽象方法(沒有實現功能),該類不能被實例化,只能被繼承,且子類必須實現抽象方法。

2. 面向對象方法

       面向對象方法(Object Oriented Method),簡稱OO方法,是在軟件開發過程中以“對象”爲中心,用面向對象的思想來指導開發活動的系統方法。正如研究OO方法的專家和學者所說,近十多年來,OO方法正在像70年代結構化方法對計算機技術應用所產生的巨大影響和促進那樣,一直在強烈地影響和促進一系列高技術的發展和多學科的綜合。

       面向對象方法起源於面向對象的編程語言。20世紀50年代後期,在編寫大型程序時,常出現相同變量名在程序不同部分發生衝突的問題。對於這個問題,ALGOL語言的設計者在ALGOL60中用“Begin……End”爲標識的程序設計形成局部變量,避免它們與程序中其他同名變量相沖突。這是編程語言中首次提供封裝的嘗試,後來此結構廣泛用於高級語言如Pascal、Ada、C之中。

       1986年在美國舉行了首屆“面向對象編程、系統、語言和應用(OOPSLA'86)”國際會議,使面向對象受到世人矚目,其後每年一屆,這標誌着面向對象方法的研究已普及到全世界。面向對象方法已被廣泛應用於程序設計語言、數據庫、設計方法學、人機接口、操作系統、分佈式系統、人工智能、實時系統、計算機體系結構以及併發工程、綜合集成工程等衆多領域,同時在其領域應用都得到了很大的發展。例如,現代的面向對象程序設計方法使得設計模式的用途、契約式設計和建模語言(如UML)技術也得到了一定提升。

3. 面向對象編程語言

       20世紀60年代中後期,在ALGOL基礎上研製開發了Simula語言,提出了對象的概念,並使用了類,也支持類繼承,出現了面向對象程序設計的雛形。70年代,經典的Smalltalk語言誕生,它以Simula的類爲核心概念,以Lisp語言爲主要內容。由於Smautalk持續不斷的改進,引入了對象、對象類、方法、實例等概念和術語,採用動態聯編和單繼承機制,以至於現在都將這一語言視爲面向對象的基礎。

       正是通過Smalltalk不斷的改進與推廣應用,人們才發現面向對象方法具有模塊化、信息封裝與隱蔽、抽象性、繼承性、多態性等獨特之處,爲研製大型軟件、提高軟件可靠性、可重用性、可擴充性和可維護性提供了有效的手段和途徑。例如,分解和模塊化可以給不同組件設定不同的功能,把一個問題分解成多個小的、獨立的、互相作用的組件,來處理複雜、大型的軟件。

       從20世紀80年代起,面向對象程序設計成爲了一種主導思想,但一直沒有專門面向對象程序設計的語言。人們將以前提出有關信息封裝與隱蔽、抽象數據類型等概念,以及BASIC、Ada和Smalltalk和Modula-2等語言進行了糅合,卻常常出現兼容性和維護性問題。後來因爲客觀需求的推動,大量的理論研究和實踐探索的進行以及不同類型的面嚮對象語言(如Eiffel、C++、Java、Object-Pascal等)的產生髮展,逐步解決了這些問題。

       在過去幾年中,Java語言成爲了廣爲應用的語言,除了它與C語言語法上的近似,還有面向對象編程的強大一面,即Java的可移植性。在近幾年計算機語言發展中,一些既支持面向過程程序設計(該怎麼做),又支持面向對象程序設計(對象該怎麼做)的語言嶄露頭腳,如Python、Ruby等。

4. 體會面向對象實例

       面向對象出現以前,結構化程序設計是程序設計的主流,結構化程序設計又稱爲面向過程的程序設計。面向過程是分析出解決問題所需要的步驟,然後用函數一步一步實現這些步驟,使用的時候一個一個依次調用即可。而面向對象是把構成問題的事物分解成各個對象,建立對象的目的不是爲了完成一個步驟,而是爲了描述某個事物在整個解決問題的步驟中的行爲。

       例如五子棋,面向過程的設計思路就是首先分析問題的步驟:開始遊戲;黑子先走;繪製畫面;判斷輸贏;輪到白子;繪製畫面;判斷輸贏;返回步驟2;輸出最後結果。把每個步驟分別用函數來實現,問題就解決了。而面對對象的設計則是從另一種思路來解決問題。黑白雙方,這兩方的行爲是一模一樣的;棋盤系統,負責繪製畫面;規則系統,負責判斷諸如犯規、輸贏等。第一類對象(玩家對象)負責接受用戶輸入信息,並告知第二類對象(棋盤對象)棋子佈局的變化,棋盤對象接收到了棋子的輸入就要負責在畫面上顯示出這種變化,同時利用第三類對象(規則系統)來對棋局進行判定。

       可以明顯的看出,面向對象是以功能來劃分問題,而不是循環步驟。同樣是繪製棋局,在面向過程的設計中,需要多個步驟執行該任務。但這樣很可能導致不同步驟的繪製棋局程序不同,因爲設計人員會根據實際情況對繪製棋局的程序進行簡化。而面向對象的設計中,繪圖只可能在棋盤對象中出現,從而保證繪製棋局的統一。

5. 面向對象編程的優點

       在面向過程程序設計中,問題被看作一系列需要完成的任務,解決問題的焦點集中於函數。其中函數是面向過程的,即它關注如何根據規定的條件完成指定的任務。在多函數程序中,許多重要的數據被放置在全局數據區,這樣它們可以被所有的函數訪問。但每個函數都可以具有自己的局部數據。這樣的程序結構很容易造成全局數據在無意中被其他函數改動,導致程序的不準確性。面向對象程序設計的出發點之一就是彌補面向過程程序設計中的一些缺點。

(1) 數據抽象的概念可以在保持外部接口不變的情況下對內部進行修改,從而減少甚至避免對外界的干擾。

(2) 通過繼承可以大幅減少冗餘代碼,並可以方便地拓展現有代碼,提高編碼效率,也降低了出錯概率,降低了軟件維護難度。

(3) 結合面向對象分析、面向對象設計,允許將問題中的對象直接映射到程序中,減少軟件開發過程中中間環節的轉換過程。

6. 何時使用面向對象編程

       面向對象的程序與人類對事物的抽象理解密切相關。舉一個例子,精靈寶可夢這款遊戲的具體代碼我們不知道,但可以確定的是其程序是通過面向對象的思想編寫的。將遊戲中的每種精靈看作一個類,而具體的某隻精靈就是其中一個類的一個實例對象,所以每種精靈的程序具有一定的獨立性。開發者可以同時編寫多隻精靈的程序,它們之間不會相互影響。

       爲什麼這裏不能使用面向過程編程?如果要開發新的精靈,那麼必須對之前的程序做大規模的修改,以使程序的各個函數能夠正常工作(以前的函數沒有新精靈的數據)。所有現在的程序和軟件開發都是使用面向對象編程的,最重要的原因還是其良好的抽象性。但對於小型程序和算法來說,面向對象的程序一般會比面向過程的程序慢,所以兩種思想各有利弊。


Python面向對象編程系列文章兩週一更!


文章未經博主同意,禁止轉載!

微笑

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