1. 程式人生 > >Python之路,Day6 - 面向對象學習

Python之路,Day6 - 面向對象學習

粘貼 實現繼承 png 情況 面向對象的特征 可用性 image 相同屬性 使用

面向過程 VS 面向對象

編程範式

編程是 程序 員 用特定的語法+數據結構+算法組成的代碼來告訴計算機如何執行任務的過程 , 一個程序是程序員為了得到一個任務結果而編寫的一組指令的集合,正所謂條條大路通羅馬,實現一個任務的方式有很多種不同的方式, 對這些不同的編程方式的特點進行歸納總結得出來的編程方式類別,即為編程範式。 不同的編程範式本質上代表對各種類型的任務采取的不同的解決問題的思路, 大多數語言只支持一種編程範式,當然也有些語言可以同時支持多種編程範式。 兩種最重要的編程範式分別是面向過程編程和面向對象編程。

面向過程編程(Procedural Programming)
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
面向過程編程依賴 - 你猜到了- procedures,一個procedure包含一組要被進行計算的步驟, 面向過程又被稱為top-down languages, 就是程序從上到下一步步執行,一步步從上到下,從頭到尾的解決問題 。基本設計思路就是程序一開始是要著手解決一個大的問題,然後把一個大問題分解成很多個小問題或子過程,這些子過程再執行的過程再繼續分解直到小問題足夠簡單到可以在一個小步驟範圍內解決。

舉個典型的面向過程的例子, 數據庫備份, 分三步,連接數據庫,備份數據庫,測試備份文件可用性。

面向對象編程

OOP編程是利用“類”和“對象”來創建各種模型來實現對真實世界的描述,使用面向對象編程的原因一方面是因為它可以使程序的維護和擴展變得更簡單,並且可以大大提高程序開發效率 ,另外,基於面向對象的程序可以使它人更加容易理解你的代碼邏輯,從而使團隊開發變得更從容。

面向對象的幾個核心特性如下

Class 類
一個類即是對一類擁有相同屬性的對象的抽象、藍圖、原型。在類中定義了這些對象的都具備的屬性(variables(data))、共同的方法

Object 對象
一個對象即是一個類的實例化後實例,一個類必須經過實例化後方可在程序中調用,一個類可以實例化多個對象,每個對象亦可以有不同的屬性,就像人類是指所有人,每個人是指具體的對象,人與人之前有共性,亦有不同

Encapsulation 封裝
在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含著類的數據和方法

Inheritance 繼承
一個類可以派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承

Polymorphism 多態
多態是面向對象的重要特性,簡單點說:“一個接口,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
對不同類的對象發出相同的消息將會有不同的行為。比如,你的老板讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至於每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定

面向對象編程(Object-Oriented Programming )介紹

對於編程語言的初學者來講,OOP不是一個很容易理解的編程方式,大家雖然都按老師講的都知道OOP的三大特性是繼承、封裝、多態,並且大家也都知道了如何定義類、方法等面向對象的常用語法,但是一到真正寫程序的時候,還是很多人喜歡用函數式編程來寫代碼,特別是初學者,很容易陷入一個窘境就是“我知道面向對象,我也會寫類,但我依然沒發現在使用了面向對象後,對我們的程序開發效率或其它方面帶來什麽好處,因為我使用函數編程就可以減少重復代碼並做到程序可擴展了,為啥子還用面向對象?”。 對於此,我個人覺得原因應該還是因為你沒有充分了解到面向對象能帶來的好處,今天我就寫一篇關於面向對象的入門文章,希望能幫大家更好的理解和使用面向對象編程。 無論用什麽形式來編程,我們都要明確記住以下原則:
  1. 寫重復代碼是非常不好的低級行為
  2. 你寫的代碼需要經常變更
開發正規的程序跟那種寫個運行一次就扔了的小腳本一個很大不同就是,你的代碼總是需要不斷的更改,不是修改bug就是添加新功能等,所以為了日後方便程序的修改及擴展,你寫的代碼一定要遵循易讀、易改的原則(專業數據叫可讀性好、易擴展)。 如果你把一段同樣的代碼復制、粘貼到了程序的多個地方以實現在程序的各個地方調用 這個功能,那日後你再對這個功能進行修改時,就需要把程序裏多個地方都改一遍,這種寫程序的方式是有問題的,因為如果你不小心漏掉了一個地方沒改,那可能會導致整個程序的運行都 出問題。 因此我們知道 在開發中一定要努力避免寫重復的代碼,否則就相當於給自己再挖坑。 還好,函數的出現就能幫我們輕松的解決重復代碼的問題,對於需要重復調用的功能,只需要把它寫成一個函數,然後在程序的各個地方直接調用這個函數名就好了,並且當需要修改這個功能時,只需改函數代碼,然後整個程序就都更新了。 其實OOP編程的主要作用也是使你的代碼修改和擴展變的更容易,那麽小白要問了,既然函數都能實現這個需求了,還要OOP幹毛線用呢? 呵呵,說這話就像,古時候,人們打仗殺人都用刀,後來出來了槍,它的主要功能跟刀一樣,也是殺人,然後小白就問,既然刀能殺人了,那還要槍幹毛線,哈哈,顯而易見,因為槍能更好更快更容易的殺人。函數編程與OOP的主要區別就是OOP可以使程序更加容易擴展和易更改。

面向對象的特性:

封裝

封裝最好理解了。封裝是面向對象的特征之一,是對象和類概念的主要特性。

封裝,也就是把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或者對象操作,對不可信的進行信息隱藏。

繼承

面向對象編程 (OOP) 語言的一個主要功能就是“繼承”。繼承是指這樣一種能力:它可以使用現有類的所有功能,並在無需重新編寫原來的類的情況下對這些功能進行擴展。

通過繼承創建的新類稱為“子類”或“派生類”。

被繼承的類稱為“基類”、“父類”或“超類”。

繼承的過程,就是從一般到特殊的過程。

要實現繼承,可以通過“繼承”(Inheritance)和“組合”(Composition)來實現。

在某些 OOP 語言中,一個子類可以繼承多個基類。但是一般情況下,一個子類只能有一個基類,要實現多重繼承,可以通過多級繼承來實現。

繼承概念的實現方式主要有2類:實現繼承、接口繼承。

? 實現繼承是指使用基類的屬性和方法而無需額外編碼的能力; ? 接口繼承是指僅使用屬性和方法的名稱、但是子類必須提供實現的能力(子類重構爹類方法); 在考慮使用繼承時,有一點需要註意,那就是兩個類之間的關系應該是“屬於”關系。例如,Employee 是一個人,Manager 也是一個人,因此這兩個類都可以繼承 Person 類。但是 Leg 類卻不能繼承 Person 類,因為腿並不是一個人。 抽象類僅定義將由子類創建的一般屬性和方法。

OO開發範式大致為:劃分對象→抽象類→將類組織成為層次化結構(繼承和合成) →用類與實例進行設計和實現幾個階段。

多態

多態性(polymorphisn)是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。 那麽,多態的作用是什麽呢?我們知道,封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是為了——代碼重用。而多態則是為了實現另一個目的——接口重用!多態的作用,就是為了類在繼承和派生的時候,保證使用“家譜”中任一類的實例的某一屬性時的正確調用。 Pyhon 很多語法都是支持多態的,比如 len(),sorted(), 你給len傳字符串就返回字符串的長度,傳列表就返回列表長度。

領域模型

好了,你現在會了面向對象的各種語法了, 那請看下本章最後的作業需求,我相信你可能是蒙蔽的, 很多同學都是學會了面向對象的語法,卻依然寫不出面向對象的程序,原因是什麽呢?原因就是因為你還沒掌握一門面向對象設計利器, 你說我讀書少別騙我, 什麽利器?

答案就是:領域建模。 從領域模型開始,我們就開始了面向對象的分析和設計過程,可以說,領域模型是完成從需求分析到面向 對象設計的一座橋梁。

領域模型,顧名思義,就是需求所涉及的領域的一個建模,更通俗的講法是業務模型。 參考百度百科(http://baike.baidu.cn/view/757895.htm ),領域模型定義如下:

從這個定義我們可以看出,領域模型有兩個主要的作用:

  1. 發掘重要的業務領域概念
  2. 建立業務領域概念之間的關系

領域建模三字經

領域模型如此重要,很多同學可能會認為領域建模很復雜,需要很高的技巧。然而事實上領域建模非常簡 單,簡單得有點難以讓人相信,領域建模的方法概括一下就是“找名詞”! 許多同學看到這個方法後估計都會笑出來:太假了吧,這麽簡單,找個初中生都會啊,那我們公司那些分 析師和設計師還有什麽用哦?

分析師和設計師當然有用,後面我們會看到,即使是簡單的找名詞這樣的操作,也涉及到分析和提煉,而 不是簡單的摘取出來就可,這種情況下分析師和設計師的經驗和技能就能夠派上用場了。但領域模型分析 也確實相對簡單,即使沒有豐富的經驗和高超的技巧,至少也能完成一個能用的領域模型。

雖然我們說“找名詞”很簡單,但一個關鍵的問題還沒有說明:從哪裏找? 如果你還記得領域模型是“需求到面向對象的橋梁”,那麽你肯定一下子就能想到:從需求模型中找,具 體來說就是從用例中找。

歸納一下域建模的方法就是“從用例中找名詞”。 當然,找到名詞後,為了能夠更加符合面向對象的要求和特點,我們還需要對這些名詞進一步完善,這就 是接下來的步驟:加屬性,連關系!

最後我們總結出領域建模的三字經方法:找名詞、加屬性、連關系

  

找名詞

who : 學員、講師、管理員

用例:

1. 管理員 創建了 北京 和 上海 兩個校區

2. 管理員 創建了 Linux \ Python \ Go 3個課程

3. 管理員 創建了 北京校區的Python 16期, Go開發第一期,和上海校區的Linux 36期 班級

4. 管理員 創建了 北京校區的 學員 小晴 ,並將其 分配 在了 班級 python 16期

5. 管理員 創建了 講師 Alex , 並將其分配 給了 班級 python 16期 和全棧脫產5期

6. 講師 Alex 創建 了一條 python 16期的 上課紀錄 Day6

7. 講師 Alex 為Day6這節課 所有的學員 批了作業 ,小晴得了A, 李磊得了C-, 嚴帥得了B

8. 學員小晴 在 python 16 的 day6裏 提交了作業

9. 學員李磊 查看了自己所報的所有課程

10 學員 李磊 在 查看了 自己在 py16期 的 成績列表 ,然後自殺了

11. 學員小晴 跟 講師 Alex 表白了

名詞列表:

管理員、校區、課程、班級、上課紀錄、作業、成績、講師、學員

加屬性

技術分享

連關系

有了類,也有了屬性,接下來自然就是找出它們的關系了。

技術分享

本節作業: 選課系統

角色:學校、學員、課程、講師
要求:
1. 創建北京、上海 2 所學校
2. 創建linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,周期,價格,通過學校創建課程
4. 通過學校創建班級, 班級關聯課程、講師
5. 創建學員時,選擇學校,關聯班級
5. 創建講師角色時要關聯學校,
6. 提供兩個角色接口
6.1 學員視圖, 可以註冊, 交學費, 選擇班級,
6.2 講師視圖, 講師可管理自己的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績
6.3 管理視圖,創建講師, 創建班級,創建課程

7. 上面的操作產生的數據都通過pickle序列化保存到文件裏

Python之路,Day6 - 面向對象學習