python编程课件_Python面向对象程序设计ppt课件.ppt
《Python面向對象程序設計ppt課件.ppt》由會員分享,可在線閱讀,更多相關《Python面向對象程序設計ppt課件.ppt(40頁珍藏版)》請在人人文庫網上搜索。
1、第6章 面向對象程序設計1面向對象程序設計(Object Oriented Programming,OOP)的思想主要針對大型軟件設計而提出,使得軟件設計更加靈活,能夠很好地支持代碼復用和設計復用,并且使得代碼具有更好的可讀性和可擴展性。面向對象程序設計的一條基本原則是計算機程序由多個能夠起到子程序作用的單元或對象組合而成,這大大地降低了軟件開發的難度,使得編程就像搭積木一樣簡單。面向對象程序設計的一個關鍵性觀念是將數據以及對數據的操作封裝在一起,組成一個相互依存、不可分割的整體,即對象。對于相同類型的對象進行分類、抽象后,得出共同的特征而形成了類,面向對象程序設計的關鍵就是如何合理地定義和組。
2、織這些類以及類之間的關系。,2Python完全采用了面向對象程序設計的思想,是真正面向對象的高級動態編程語言,完全支持面向對象的基本功能,如封裝、繼承、多態以及對基類方法的覆蓋或重寫。但與其他面向對象程序設計語言不同的是,Python中對象的概念很廣泛,Python中的一切內容都可以稱為對象例如,字符串、列表、字典、元組等內置數據類型都具有和類完全相似的語法和用法。創建類時用變量形式表示的對象屬性稱為數據成員或成員屬性,用函數形式表示的對象行為稱為成員函數或成員方法,成員屬性和成員方法統稱為類的成員。,3,6.1.1 類定義語法,Python使用class關鍵字來定義類,class關鍵字之后是。
3、一個空格,然后是類的名字,再然后是一個冒號,最后換行并定義類的內部實現。類名的首字母一般要大寫,當然您也可以按照自己的習慣定義類名,但是一般推薦參考慣例來命名,并在整個系統的設計和實現中保持風格一致,這一點對于團隊合作尤其重要。例如 class Car 新式類必須有至少一個基類 def inforself print This is a car ,4,6.1.1 類定義語法,定義了類之后,可以用來實例化對象,并通過“對象名.成員”的方式來訪問其中的數據成員或成員方法,例如下面的代碼 car Car car.infor This is a car 在Python中,可以使用內置方法isinst。
4、ance來測試一個對象是否為某個類的實例,下面的代碼演示了isinstance的用法。 isinstancecar, Car True isinstancecar, str False,5,6.1.1 類定義語法,最后,Python提供了一個關鍵字“pass”,類似于空語句,可以用在類和函數的定義中或者選擇結構中。當暫時沒有確定如何實現功能,或者為以后的軟件升級預留空間,或者其他類型功能時,可以使用該關鍵字來“占位”。例如下面的代碼都是合法 class A pass def demo pass if 53 pass,6,6.1.2 self參數,類的所有實例方法都必須至少有一個名為“self”。
5、的參數,并且必須是方法的第一個形參(如果有多個形參的話),“self”參數代表將來要創建的對象本身。在類的實例方法中訪問實例屬性時需要以“self”為前綴,但在外部通過對象名調用對象方法時并不需要傳遞這個參數,如果在外部通過類名調用對象方法則需要顯式為self參數傳值。,7,6.1.2 self參數,在Python中,在類中定義實例方法時將第一個參數定義為“self”只是一個習慣,而實際上類的實例方法中第一個參數的名字是可以變化的,而不必須使用“self”這個名字,例如下面的代碼 class A def inithahaha, v hahaha.value v def showhahaha 。
6、printhahaha.value a A3 a.show 3,8,6.1.3 類成員與實例成員,這里主要指數據成員,或者廣義上的屬性。可以說屬性有兩種,一種是實例屬性,另一種是類屬性。實例屬性一般是指在構造函數init中定義的,定義和使用時必須以self作為前綴;類屬性是在類中所有方法之外定義的數據成員。在主程序中(或類的外部),實例屬性屬于實例對象,只能通過對象名訪問;而類屬性屬于類,可以通過類名或對象名訪問。,9,6.1.3 類成員與實例成員,在類的方法中可以調用類本身的其他方法,也可以訪問類屬性以及對象屬性。在Python中比較特殊的是,可以動態地為類和對象增加成員,這一點是和很多面。
7、向對象程序設計語言不同的,也是Python動態類型特點的一種重要體現。,10,6.1.3 類成員與實例成員,class Car price 100000 定義類屬性 def initself, c self.color c 定義實例屬性 car1 CarRed car2 CarBlue printcar1.color, Car.price Car.price 110000 修改類屬性 Car.name QQ 增加類屬性 car1.color Yellow 修改實例屬性 printcar2.color, Car.price, Car.name printcar1.color, Ca。
8、r.price, Car.name def setSpeedself, s self.speed s car1.setSpeed types.TypesetSpeed, Car 動態為對象增加成員方法 car1.setSpeed50 調用對象的成員方法 printcar1.speed,11,6.1.3 類成員與實例成員,在Python中,函數和方法是有區別的。方法一般指與特定實例綁定的函數,通過對象調用方法時,對象本身將被作為第一個參數傳遞過去,普通函數并不具備這個特點。 class Demo pass t Demo def testself, v self.value v t.tes。
9、t test t.test t.testt, 3 printt.value 3 t.test types.Typetest, t t.test t.test5 printt.value 5,12,6.1.4 私有成員與公有成員,Python并沒有對私有成員提供嚴格的訪問保護機制。在定義類的屬性時,如果屬性名以兩個下劃線“”開頭則表示是私有屬性,否則是公有屬性。私有屬性在類的外部不能直接訪問,需要通過調用對象的公有成員方法來訪問,或者通過Python支持的特殊方式來訪問。Python提供了訪問私有屬性的特殊方式,可用于程序的測試和調試,對于成員方法也具有同樣的性質。 私有屬性是為了數據封裝和。
10、保密而設的屬性,一般只能在類的成員方法(類的內部)中使用訪問,雖然Python支持一種特殊的方式來從外部直接訪問類的私有成員,但是并不推薦您這樣做。公有屬性是可以公開使用的,既可以在類的內部進行訪問,也可以在外部程序中使用。,13,6.1.4 私有成員與公有成員, class A def initself, value1 0, value2 0 self._value1 value1 self.value2 value2 def setValueself, value1, value2 self._value1 value1 self.value2 value2 def shows。
11、elf printself._value1 printself.value2 a A a._value1 0 a._Avalue2 在外部訪問對象的私有數據成員 0,14,6.1.4 私有成員與公有成員,在IDLE環境中,在對象或類名后面加上一個圓點“.”,稍等一秒鐘則會自動列出其所有公開成員,模塊也具有同樣的特點。 而如果在圓點“.”后面再加一個下劃線,則會列出該對象或類的所有成員,包括私有成員。,15,6.1.4 私有成員與公有成員,在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其是在類的定義中。用下劃線作為變量名和方法名前綴和后綴來表示類的特殊成員 _xxx這樣的對象叫。
12、做保護成員,不能用from module import *導入,只有類對象和子類對象能訪問這些成員; xxx系統定義的特殊成員; xxx類中的私有成員,只有類對象自己能訪問,子類對象也不能訪問到這個成員,但在對象外部可以通過“對象名._類名xxx”這樣的特殊方式來訪問。Python中不存在嚴格意義上的私有成員。,16,6.1.4 私有成員與公有成員,另外,在IDLE交互模式下,一個下劃線“_”表示解釋器中最后一次顯示的內容或最后一次語句正確執行的輸出結果。例如 3 5 8 _ 2 10 _ * 3 30 _ / 5 6 3 3 1/0 Traceback most recent call 。
13、last File , line 1, in 1/0 ZeroDivisionError integer division or modulo by zero _ 3,17,6.1.4 私有成員與公有成員, class Fruit def initself self.color Red self.price 1 apple Fruit apple.price 顯示對象公開數據成員的值 1 apple.price 2 修改對象公開數據成員的值 apple.price 2 printapple.price, apple._Fruitcolor 顯示對象私有數據成員的值 2 Red appl。
14、e._Fruitcolor Blue 修改對象私有數據成員的值 printapple.price, apple._Fruitcolor 2 Blue printapple.color 不能直接訪問對象的私有數據成員,出錯 AttributeError Fruit instance has no attribute color,18,6.2 方法,在類中定義的方法可以粗略分為四大類公有方法、私有方法、靜態方法和類方法。其中,公有方法、私有方法都屬于對象,私有方法的名字以兩個下劃線“”開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬于類和對象的成員;公有方法通過對象名直接調用。
15、,私有方法不能通過對象名直接調用,只能在屬于對象的方法中通過“self”調用或在外部通過Python支持的特殊方式來調用。如果通過類名來調用屬于對象的公有方法,需要顯式為該方法的“self”參數傳遞一個對象名,用來明確指定訪問哪個對象的數據成員。靜態方法和類方法都可以通過類名和對象名調用,但不能直接訪問屬于對象的成員,只能訪問屬于類的成員。一般將“cls”作為類方法的第一個參數名稱,但也可以使用其他的名字作為參數,并且在調用類方法時不需要為該參數傳遞值。,19,6.2 方法,20,6.2 方法, r Root3 r.classShowTotal 通過對象來調用類方法 1 r.staticSh。
16、owTotal 通過對象來調用靜態方法 1 r.show self.value 3 Root.total 1 rr Root5 Root.classShowTotal 通過類名調用類方法 2 Root.staticShowTotal 通過類名調用靜態方法 2,21,6.2 方法, Root.show 試圖通過類名直接調用實例方法,失敗 TypeError unbound show must be called with Root instance as first argument got nothing instead Root.showr 但是可以通過這種方法來調用方法并訪問實例成員 。
17、self.value 3 Root.total 2 r.show self.value 3 Root.total 2 Root.showrr 通過類名調用實例方法時為self參數顯式傳遞對象名 self.value 5 Root.total 2 rr.show self.value 5 Root.total 2,22,6.3 屬性,Python 2.x和Python 3.x對屬性的實現和處理方式不一樣,內部實現有較大的差異,使用時應注意二者之間的區別。,23,6.3.2 Python 3.x中的屬性,在Python 3.x中,屬性得到了較為完整的實現,支持更加全面的保護機制。例如下面的代碼所示。
18、,如果設置屬性為只讀,則無法修改其值,也無法為對象增加與屬性同名的新成員,同時,也無法刪除對象屬性。,24,6.3.2 Python 3.x中的屬性, class Test def initself, value self.value value property def valueself 只讀,無法修改和刪除 return self.value t Test3 t.value 3 t.value 5 只讀屬性不允許修改值 AttributeError cant set attribute t.v5 動態增加新成員 t.v 5 del t.v 動態刪除成員 del t.value 試圖。
19、刪除對象屬性,失敗 AttributeError cant delete attribute t.value 3,25,6.3.2 Python 3.x中的屬性,下面的代碼則把屬性設置為可讀、可修改,而不允許刪除。 class Test def initself, value self.value value def getself return self.value def setself, v self.value v value propertyget, set def showself printself.value t Test3 t.value 允許讀取屬性值 3 t.va。
20、lue 5 允許修改屬性值 t.value 5 t.show 屬性對應的私有變量也得到了相應的修改 5 del t.value 試圖刪除屬性,失敗 AttributeError cant delete attribute,26,6.3.2 Python 3.x中的屬性,也可以將屬性設置為可讀、可修改、可刪除。 class Test def initself, value self.value value def getself return self.value def setself, v self.value v def delself del self.value value p。
21、ropertyget, set, del def showself printself.value,27,6.3.2 Python 3.x中的屬性, t Test3 t.show 3 t.value 3 t.value 5 t.show 5 t.value 5 del t.value t.value AttributeError Test object has no attribute _Testvalue t.show AttributeError Test object has no attribute _Testvalue t.value 1 為對象動態增加屬性和對應的私有數據成員 。
22、t.show 1 t.value 1,28,6.4.1 常用特殊方法,Python類有大量的特殊方法,其中比較常見的是構造函數和析構函數。Python中類的構造函數是init,一般用來為數據成員設置初值或進行其他必要的初始化工作,在創建對象時被自動調用和執行,可以通過為構造函數定義默認值參數來實現類似于其他語言中構造函數重載的目的。如果用戶沒有設計構造函數,Python將提供一個默認的構造函數用來進行必要的初始化工作。Python中類的析構函數是del,一般用來釋放對象占用的資源,在Python刪除對象和收回對象空間時被自動調用和執行。如果用戶沒有編寫析構函數,Python將提供一個默認的析構。
23、函數進行必要的清理工作。,29,6.4.1 常用特殊方法,30,6.4.2 案例精選,在MyArray.py文件中,定義了一個數組類,重寫了一部分特殊方法以支持數組之間、數組與整數之間的四則運算以及內積、大小比較、成員測試和元素訪問等運算符。,31,6.4.2 案例精選, import MyArray a MyArray.MyArray1, 2, 3, 4, 5, 6 b MyArray.MyArray6, 5, 4, 3, 2, 1 lena 6 a.dotb 56 a a b False a a True 3 in a True,32,6.4.2 案例精選, a * 3 3, 6, 9。
24、, 12, 15, 18 a 2 3, 4, 5, 6, 7, 8 a 2 1, 4, 9, 16, 25, 36 a / 2 0.5, 1.0, 1.5, 2.0, 2.5, 3.0 a 1, 2, 3, 4, 5, 6 a0 8 a 8, 2, 3, 4, 5, 6,33,6.5 繼承機制,繼承是為代碼復用和設計復用而設計的,是面向對象程序設計的重要特性之一。當我們設計一個新類時,如果可以繼承一個已有的設計良好的類然后進行二次開發,無疑會大幅度減少開發工作量。在繼承關系中,已有的、設計好的類稱為父類或基類,新設計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。
25、。如果需要在派生類中調用基類的方法,可以使用內置函數super或者通過“基類名.方法名”的方式來實現這一目的。 Python支持多繼承,如果父類中有相同的方法名,而在子類中使用時沒有指定父類名,則Python解釋器將從左向右按順序進行搜索。,34,6.5 繼承機制,例1設計Person類,并根據Person派生Teacher類,分別創建Person類與Teacher類的對象。 import types class Personobject 基類必須繼承于object,否則在派生類中將無法使用super函數 def initself, name , age 20, sex man self。
26、.setNamename self.setAgeage self.setSexsex def setNameself, name if typename types.StringType print name must be string. return self.name name def setAgeself, age if typeage types.IntType print age must be integer. return self.age age def setSexself, sex if sex man and sex woman print sex must。
27、 be man or woman return self.sex sex def showself print self.name print self.age print self.sex,35,6.5 繼承機制,class TeacherPerson def initself, name, age 30, sex man, department Computer 調用基類構造方法初始化基類的私有數據成員 superTeacher, self.initname, age, sex Person.initself, name, age, sex 也可以這樣初始化基類的私有數據成員 se。
28、lf.setDepartmentdepartment 初始化派生類的數據成員 def setDepartmentself, department if typedepartment types.StringType print department must be a string. return self.department department def showself superTeacher, self.show print self.department,36,6.5 繼承機制,if name main zhangsan PersonZhang San, 19, man zh。
29、angsan.show lisi TeacherLi Si, 32, man, Math lisi.show lisi.setAge40 調用繼承的方法修改年齡 lisi.show,37,6.5 繼承機制,為了更好地理解Python類的繼承機制,我們來看下面的Python 2.7.11代碼,請認真體會構造函數、私有方法以及普通公開方法的繼承原理。 class A def initself self.private self.public def privateself print private of A def publicself print public of A class BA。
30、 def privateself print private of B def publicself print public of B,38,6.5 繼承機制, b B 自動調用從基類A繼承的構造函數 private of A public of B print n.joindirb 查看對象b的成員 _Aprivate _Bprivate doc init module Public,39,6.5 繼承機制, class CA def initself self.private self.public def privateself print private of C def publicself print public of C c C 自動調用派生類自己的構造函數 private of C public of C print n.joindirc _Aprivate _Cprivate doc init module public,40,。
總結
以上是生活随笔為你收集整理的python编程课件_Python面向对象程序设计ppt课件.ppt的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 28款数据恢复软件对比测试
- 下一篇: Unicode 汉字编码表