編程是程序員用特定的語法+數據結構+算法組成的代碼來告訴計算機如何執行任務的過程,一個程序是程序員爲了獲得一個任務結果而編寫的一組指令的集合,正所謂條條大路通羅馬,實現一個任務的方式有不少種不一樣的方式,對這些不一樣的編程方式的特色進行概括總結得出來的編程方式類別,即爲編程範式。html
不一樣的編程範式本質上表明對各類類型的任務採起的不一樣的解決問題的思路, 兩種最重要的編程範式分別是面向過程編程和面向對象編程。python
面向過程概念linux
面向過程的程序設計的核心是過程(流水線式思惟),過程即解決問題的步驟,面向過程的設計就比如精心設計好一條流水線,考慮周全何時處理什麼問題。git
特色程序員
優勢:複雜問題流程化,進而簡單化。
缺點:可擴展性差、可維護性差(一套流程僅解決一個問題,若是修改代碼,會很是繁複)。算法
適用場景編程
通常用於那些功能一旦實現以後就不多須要改變的場景, 若是你只是寫一些簡單的腳本,去作一些一次性任務。著名的例子有Linux內核,git,以及Apache HTTP Server等。但若是你要處理的任務是複雜的,且須要不斷迭代和維護 的, 那仍是用面向對象最方便。json
import json def interactive(): name = input('>>: ').strip() pwd = input('>>: ').strip() email = input('>>: ').strip() return { 'name': name, 'pwd': pwd, 'email': email } def check(user_info): is_valid = True if len(user_info['name']) == 0: print('用戶名不能爲空') is_valid = False if len(user_info['pwd']) < 0: print('密碼不能少於6位') is_valid = False return { 'is_valid': is_valid, 'user_info': user_info } def register(check_info): if check_info['is_valid']: with open('db.json', 'w', encoding='utf-8') as f: json.dump(check_info['user_info'], f) def main(): user_info = interactive() check_info = check(user_info) register(check_info) if __name__ == '__main__': main()
OOP(Object Oriented Programing)編程是利用「類」和「對象」來建立各類模型來實現對真實世界的描述。與面向過程機械式的思惟方式造成鮮明對比,面向對象更加註重對現實世界而非流程的模擬,是一種「上帝式」的思惟方式。數據結構
核心就是對象二字,對象就是特徵與技能的結合體。ide
特色
優勢:一、使程序更加容易擴展和易更改,使開發效率變得更高(對某個對象類屬性的修改,會馬上反映到整個體系中) 二、基於面向對象的程序可使他人更加容易理解代碼邏輯。
缺點:編程複雜度高、可控性差(沒法像面向過程程序那樣精準預測問題處理過程與結果,對象之間的交互,比較難預測最終的結果)
適用場景
應用於需求常常變化的軟件中,通常需求的變化都集中在用戶層,互聯網應用,企業內部軟件,遊戲等都是面向對象的程序設計大顯身手的好地方。
類:一個類便是對一類擁有相同屬性的對象的抽象、藍圖、原型、模板(一系列對象類似特徵和技能的結合體)。在類中定義了這些對象的都具有的屬性(variables(data))、共同的方法。 注意:站在不一樣的角度,獲得的分類是不同的。
屬性:人類包含不少特徵,把這些特徵用程序來描述的話,叫作屬性,好比年齡、身高、性別、姓名等都叫作屬性,一個類中,能夠有多個屬性。
方法:人類不止有身高、年齡、性別這些屬性,還能作好多事情,好比說話、走路、吃飯等,相比較於屬性是名詞,說話、走路是動詞,這些動詞用程序來描述就叫作方法。
實例(對象):一個對象便是一個類的實例化後實例,一個類必須通過實例化後方可在程序中調用,一個類能夠實例化多個對象,每一個對象亦能夠有不一樣的屬性,就像人類是指全部人,每一個人是指具體的對象,人與人以前有共性,亦有不一樣。
實例化:把一個類轉變爲一個對象的過程就叫實例化。
在類中對數據賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裏面包含着類的數據和方法。
一個類能夠派生出子類,在這個父類裏定義的屬性、方法自動被子類繼承。
多態是面向對象的重要特性,簡單說:「一個接口,多種實現」,指一個基類中派生出了不一樣的子類,且每一個子類在繼承了一樣的方法名的同時又對父類的方法作了不一樣的實現,這就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再經過這個抽象的事物, 與不一樣的具體事物進行對話。
多態容許將子類的對象看成父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裏引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象能夠在運行期間動態綁定。
抽象指對現實世界問題和實體的本質表現,行爲和特徵建模,創建一個相關的子集,能夠用於 繪程序結構,從而實現這種模型。抽象不只包括這種模型的數據屬性,還定義了這些數據的接口。
對某種抽象的實現就是對此數據及與之相關接口的現實化(realization)。現實化這個過程對於客戶 程序應當是透明並且無關的。
封裝描述了對數據/信息進行隱藏的觀念,它對數據屬性提供接口和訪問函數。經過任何客戶端直接對數據的訪問,無視接口,與封裝性都是背道而馳的,除非程序員容許這些操做。做爲實現的 一部分,客戶端根本就不須要知道在封裝以後,數據屬性是如何組織的。在Python中,全部的類屬性都是公開的,但名字可能被「混淆」了,以阻止未經受權的訪問,但僅此而已,再沒有其餘預防措施了。這就須要在設計時,對數據提供相應的接口,以避免客戶程序經過不規範的操做來存取封裝的數據屬性。
注意:封裝毫不是等於「把不想讓別人看到、之後可能修改的東西用private隱藏起來」
真正的封裝是,通過深刻的思考,作出良好的抽象,給出「完整且最小」的接口,並使得內部細節能夠對外透明(注意:對外透明的意思是,外部調用者能夠順利的獲得本身想要的任何功能,徹底意識不到內部細節的存在)
合成擴充了對類的 述,使得多個不一樣的類合成爲一個大的類,來解決現實問題。合成 述了 一個異常複雜的系統,好比一個類由其它類組成,更小的組件也多是其它的類,數據屬性及行爲, 全部這些合在一塊兒,彼此是「有一個」的關係。
派生描述了子類衍生出新的特性,新類保留已存類類型中全部須要的數據和行爲,但容許修改或者其它的自定義操做,都不會修改原類的定義。
繼承描述了子類屬性從祖先類繼承這樣一種方式
繼承結構表示多「代」派生,能夠述成一個「族譜」,連續的子類,與祖先類都有關係。
基於繼承。
泛化表示全部子類與其父類及祖先類有同樣的特色。
特化描述全部子類的自定義,也就是,什麼屬性讓它與其祖先類不一樣。
多態指的是同一種事物的多種狀態:水這種事物有多種不一樣的狀態:冰,水蒸氣
多態性的概念指出了對象如何經過他們共同的屬性和動做來操做及訪問,而不需考慮他們具體的類。
冰,水蒸氣,都繼承於水,它們都有一個同名的方法就是變成雲,可是冰.變雲(),與水蒸氣.變雲()是大相徑庭的過程,雖然調用的方法都同樣
自省也稱做反射,這個性質展現了某對象是如何在運行期取得自身信息的。若是傳一個對象給你,你能夠查出它有什麼能力,這是一項強大的特性。若是Python不支持某種形式的自省功能,dir和type內建函數,將很難正常工做。還有那些特殊屬性,像__dict__,__name__及__doc__
不少人在學完了python的class機制以後,遇到一個生產中的問題,仍是會懵逼,這其實太正常了,由於任何程序的開發都是先設計後編程,python的class機制只不過是一種編程方式,若是你硬要拿着class去和你的問題死磕,變得更加懵逼都是分分鐘的事,在之前,軟件的開發相對簡單,從任務的分析到編寫程序,再到程序的調試,能夠由一我的或一個小組去完成。可是隨着軟件規模的迅速增大,軟件任意麪臨的問題十分複雜,須要考慮的因素太多,在一個軟件中所產生的錯誤和隱藏的錯誤、未知的錯誤可能達到驚人的程度,這也不是在設計階段就徹底解決的。
因此軟件的開發其實一整套規範,咱們所學的只是其中的一小部分,一個完整的開發過程,須要明確每一個階段的任務,在保證一個階段正確的前提下再進行下一個階段的工做,稱之爲軟件工程。
面向對象的軟件工程包括下面幾個部分:
軟件工程中的系統分析階段,要求分析員和用戶結合在一塊兒,對用戶的需求作出精確的分析和明確的表述,從大的方面解析軟件系統應該作什麼,而不是怎麼去作。面向對象的分析要按照面向對象的概念和方法,在對任務的分析中,從客觀存在的事物和事物之間的關係,概括出有關的對象(對象的‘特徵’和‘技能’)以及對象之間的聯繫,並將具備相同屬性和行爲的對象用一個類class來標識。
創建一個能反映這是工做狀況的需求模型,此時的模型是粗略的。
根據面向對象分析階段造成的需求模型,對每一部分分別進行具體的設計。
首先是類的設計,類的設計可能包含多個層次(利用繼承與派生機制)。而後以這些類爲基礎提出程序設計的思路和方法,包括對算法的設計。
在設計階段並不牽涉任何一門具體的計算機語言,而是用一種更通用的描述工具(如僞代碼或流程圖)來描述
根據面向對象設計的結果,選擇一種計算機語言把它寫成程序,能夠是python
在寫好程序後交給用戶使用前,必須對程序進行嚴格的測試,測試的目的是發現程序中的錯誤並修正它。
面向對的測試是用面向對象的方法進行測試,以類做爲測試的基本單元。
正如對任何產品都須要進行售後服務和維護同樣,軟件在使用時也會出現一些問題,或者軟件商想改進軟件的性能,這就須要修改程序。
因爲使用了面向對象的方法開發程序,使用程序的維護比較容易。
由於對象的封裝性,修改一個對象對其餘的對象影響很小,利用面向對象的方法維護程序,大大提升了軟件維護的效率,可擴展性高。
在面向對象方法中,最先發展的確定是面向對象編程(OOP),那時OOA和OOD都尚未發展起來,所以程序設計者爲了寫出面向對象的程序,還必須深刻到分析和設計領域,尤爲是設計領域,那時的OOP實際上包含了如今的OOD和OOP兩個階段,這對程序設計者要求比較高,許多人感到很難掌握。
如今設計一個大的軟件,是嚴格按照面向對象軟件工程的5個階段進行的,這個5個階段的工做不是由一我的從頭至尾完成的,而是由不一樣的人分別完成,這樣OOP階段的任務就比較簡單了。程序編寫者只須要根據OOd提出的思路,用面嚮對象語言編寫出程序既可。
角色:學校、學員、課程、講師
要求:
1. 建立北京、上海 2 所學校
2. 建立linux , python , go 3個課程 , linux\py 在北京開, go 在上海開
3. 課程包含,週期,價格,經過學校建立課程
4. 經過學校建立班級, 班級關聯課程、講師
5. 建立學員時,選擇學校,關聯班級
5. 建立講師角色時要關聯學校,
6. 提供兩個角色接口
6.1 學員視圖, 能夠註冊, 交學費, 選擇班級,
6.2 講師視圖, 講師可管理本身的班級, 上課時選擇班級, 查看班級學員列表 , 修改所管理的學員的成績
6.3 管理視圖,建立講師, 建立班級,建立課程
7. 上面的操做產生的數據都經過pickle序列化保存到文件裏