Python程序設(shè)計課程14、面向?qū)ο笳n件_第1頁
Python程序設(shè)計課程14、面向?qū)ο笳n件_第2頁
Python程序設(shè)計課程14、面向?qū)ο笳n件_第3頁
Python程序設(shè)計課程14、面向?qū)ο笳n件_第4頁
Python程序設(shè)計課程14、面向?qū)ο笳n件_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Python 面向?qū)ο?Object Oriented Programming 第1頁,共63頁。程序的概念菜譜=配料+操作步驟程序=數(shù)據(jù)結(jié)構(gòu)+算法操作步驟的描述對數(shù)據(jù)的描述程序就是要告訴計算機(jī)要做什么第2頁,共63頁。面向過程與面向?qū)ο蟪绦?算法+數(shù)據(jù)代碼可以選擇以算法為核心或者以數(shù)據(jù)為核心第3頁,共63頁。面向過程與面向?qū)ο髢煞N范型以算法為核心:圍繞“正在發(fā)生什么”進(jìn)行編寫面向過程編程:程序具有一系列線性步驟,主體思想是代碼作用于數(shù)據(jù)以數(shù)據(jù)為核心:圍繞“將影響誰”進(jìn)行編寫面向?qū)ο缶幊蹋簢@數(shù)據(jù)及為數(shù)據(jù)嚴(yán)格定義的接口來組織程序,用數(shù)據(jù)控制對代碼的訪問第4頁,共63頁。面向過程與面向?qū)ο蟪绦?

2、算法+數(shù)據(jù)代碼可以選擇以算法為核心或者以數(shù)據(jù)為核心面向過程面向?qū)ο蟪绦?數(shù)據(jù)結(jié)構(gòu)+算法+程序設(shè)計的方法+語言工具和環(huán)境第5頁,共63頁。面向?qū)ο缶幊蹋∣OP)Object Oriented Programming,簡稱OOP:當(dāng)前最主流的編程思想數(shù)據(jù)+功能復(fù)用性靈活性擴(kuò)展性基本單元:對象 第6頁,共63頁。面向?qū)ο缶幊蹋∣OP)對于python而言,一切都是對象第7頁,共63頁。面向?qū)ο蟾拍铑悾何覀內(nèi)粘I钪心軌虺橄蟪鰜淼木哂邢嗤拍罨蛘呦嗤瑢傩缘囊活愂挛锏募侠纾篋og,是一種抽象概念實(shí)例:以類為基礎(chǔ),實(shí)實(shí)在在的有血有肉的制作出來,豐滿出來,得到的就是類的實(shí)例,也叫作類的對象第8頁,共63

3、頁。類的概念已經(jīng)將狗狗的信息抽象出來,我們就可以定義一個類了。狗就是一個類,把現(xiàn)實(shí)生活中的一類事物進(jìn)行了抽象和總結(jié)。類名Dog信息名字信息年齡信息品種技能叫技能跑第9頁,共63頁。對象(實(shí)例)的概念信息:名字:bili年齡:1歲品種:大型犬技能:叫、跑跳起來揀球當(dāng)具體指代一個事物的時候,就是一個對象第10頁,共63頁。面向?qū)ο蟾拍顚傩裕汗灿屑寄埽航?、跑?1頁,共63頁。面向?qū)ο蟾拍铑悓ο笠活愂挛锏某橄筇攸c(diǎn)類的實(shí)例具體而形象類是抽象的,實(shí)例則是具體的先去設(shè)計類,才能實(shí)例化這個對象第12頁,共63頁。面向?qū)ο缶幊痰脑瓌t封裝、繼承、多態(tài)封裝:list.pop()如何實(shí)現(xiàn)的?隱藏實(shí)現(xiàn)方案細(xì)節(jié)將代碼及

4、其處理的數(shù)據(jù)綁定在一起的一種編程機(jī)制,用于保證程序和數(shù)據(jù)不受外部干擾且不會被誤用第13頁,共63頁。哺乳動物動物爬行動物犬科貓科家畜野生獅子狗獵狗金毛拉布拉多繼承第14頁,共63頁。面向?qū)ο蟮睦^承第15頁,共63頁。繼承一個對象獲得另一個對象屬性的過程,用于實(shí)現(xiàn)按層分類的概念一個深度繼承的子類繼承了類層次中它的每個祖先的所有屬性超類、基類、父類子類、派生類第16頁,共63頁。多態(tài)允許一個接口被多個通用的類動作使用的特性,具體使用哪個動作與應(yīng)用場合相關(guān)用于為一組相關(guān)的動作設(shè)計一個通用的接口,以降低程序的復(fù)雜性傳遞不同的數(shù)據(jù),可以完成不同的計算,能夠自動判斷是哪個數(shù)據(jù),就稱為多態(tài)第17頁,共63頁

5、。面向?qū)ο蟮亩鄳B(tài)第18頁,共63頁。面向?qū)ο缶幊痰脑瓌t面向?qū)ο?原則封裝、繼承和多態(tài)第19頁,共63頁。類的組成類的成員:類的數(shù)據(jù)和方法數(shù)據(jù):成員變量或?qū)嵗兞?,類的?shù)據(jù)用變量來表示,保存在變量中。方法:成員方法或成員函數(shù),是操作數(shù)據(jù)的代碼,用于定義如何操作成員變量,因此一個類可以實(shí)現(xiàn)行為,完成特定的功能是通過方法來定義的。第20頁,共63頁。用python定義類class ClassName(bases):class documentation string class suitebases,指超類的名字,是一個或多個用于繼承的父類的集合類體可以包含:聲明語句,類成員定義、數(shù)據(jù)屬性、方法注意

6、:如果不存在繼承關(guān)系, ClassName后面的(bases)可以不提供;類文檔為可選內(nèi)容第21頁,共63頁。指定超類將其它類名寫在class語句后的圓括號內(nèi)可以指定超類class Filter:class SPAMFilter(Filter):第22頁,共63頁。class Firstclass:spam=30def display(self):print self.spamx=Firstclass()x.display()定義類創(chuàng)建類實(shí)例對象調(diào)用方法類數(shù)據(jù)屬性類方法用python定義類第23頁,共63頁。用python定義類class語句的一般形式class ClassName(bases

7、): data=value def method(self,): self.member=value為什么不是指向類而是指向?qū)ο?第24頁,共63頁。self的含義首先明確的是self只有在類的方法中才會有,獨(dú)立的函數(shù)或方法是不必帶有self的。self在定義類的方法時是必須有的,在調(diào)用時不必傳入相應(yīng)的參數(shù)。一個類的實(shí)例在調(diào)用類的方法時,自動將自己做為第一個參數(shù)傳入設(shè)計方法中,因此形象地命名為self。沒有self這個參數(shù),成員方法就無法訪問他們要對其特性進(jìn)行操作的對象本身了。第25頁,共63頁。定義類的屬性直接在類里定義class Dog: name=Bili age=1構(gòu)造函數(shù):初始化一個

8、類的實(shí)例時由系統(tǒng)自動調(diào)用def _init_(self, ):使用構(gòu)造函數(shù)定義class Dog: def _init_(self,name,age): =name self.age=age第26頁,共63頁。定義類的方法定義一個類后,可以根據(jù)需要實(shí)例化出多個對象如何利用對象完成真正有用的工 作必須有一種辦法能向?qū)ο蟀l(fā)出請求,令其做一些事情,這就是類的方法Lightdef on():def off():def brighten():def dim():第27頁,共63頁。實(shí)例初始化類是可調(diào)用的,類似函數(shù)調(diào)用一樣,通過調(diào)用類來創(chuàng)建實(shí)例:instance=ClassName(or

9、gs)做了兩件事情:1、生成一個類的實(shí)例2、將類名后面括號中的參數(shù)傳遞給類的構(gòu)造函數(shù)第28頁,共63頁。函數(shù)和方法函數(shù):直接調(diào)用函數(shù)名來調(diào)用的plus(x,y)plus(1,2)方法:從屬于某個類,由類的實(shí)例或者別的程序來調(diào)用例如類test.plus(1,2)第29頁,共63頁。定義一個學(xué)生類。類屬性:1、姓名name2、年齡age3、成績course共包含三門課,每課成績的類型為整數(shù)類方法:1、獲取學(xué)生的姓名:get_name()返回類型:str2、獲取學(xué)生的年齡:get_age()返回類型:int3、返回3門科目中最高的分?jǐn)?shù)。get_course()返回類型:int,可以使用max()函數(shù)

10、寫好類以后,可以定義2個同學(xué)測試下:zm=Student(zhangming,20,69,88,100)第30頁,共63頁。class Student(): def _init_(self,name,age,scores): =name self.age=age self.scores=scores def get_name(self): return def get_age(self): return self.age def get_course(self): return max(self.scores)zm=Student(zhangming,20

11、,69,88,100)print zm.get_name()print zm.get_age()print zm.get_course()第31頁,共63頁。定義一個員工類。類屬性:1、姓名name2、工資salary3、員工數(shù)量empCount每新加入一個員工,員工數(shù)量加1類方法:1、打印員工總數(shù)量: displayCount()2、打印員工信息: displayEmployee()寫好類以后,可以定義2個員工實(shí)例測試下:emp1 = Employee(Zara, 2000)emp2 = Employee(Manni, 5000)第32頁,共63頁。#coding: UTF-8 class

12、Employee: 所有員工的基類 empCount = 0 def _init_(self, name, salary): = name self.salary = salary Employee.empCount += 1 def displayCount(self): print Total Employee %d % Employee.empCount def displayEmployee(self): print Name : , , , Salary: , self.salary創(chuàng)建 Employee 類的第一個對象emp1 = Employ

13、ee(Zara, 2000)創(chuàng)建 Employee 類的第二個對象emp2 = Employee(Mai, 5000)emp1.displayEmployee()emp2.displayEmployee()print Total Employee %d % Employee.empCount第33頁,共63頁。定義一個字典類:dictclass。完成下面的功能:類屬性:1、dict=dictclass(你需要操作的字典對象)類方法:1、刪除某個key:del_dict(key)2、判斷某個鍵是否在字典里,如果在返回鍵對應(yīng)的值,不存在則返回“notfound”:get_dict(key)3、返回

14、鍵組成的列表:返回類型(list):get_key()4、合并字典,并且返回合并后字典的values組成的列表。返回類型(list):update_dict(要合并的字典)第34頁,共63頁。class dictclass(object): def _init_(self, dict): self.dict = dict def get_dict(self, key): if self.dict. has_key(key): return self.dictkey return not found def del_dict(self, key): if self.dict.has_key(ke

15、y): self.dict.pop(key) else: return no that keydef get_key(self): return self.dict.keys() def updata_dict(self, dict2): self.dict = dict(self.dict, *dict2) return self.dict.values()A = dictclass(a: 1, b: 2)print A.get_dict(c)print A.del_dict(c)print A.get_key()print A.updata_dict(c: 3, d: 4) 第35頁,共6

16、3頁。私有屬性和私有方法方法和變量私有:內(nèi)部使用,類的內(nèi)部進(jìn)行調(diào)用公共:外部可見,在外部可以調(diào)用第36頁,共63頁。類的私有屬性類的私有屬性:python中并不直接支持私有方式,而是要靠程序員息把握在外部進(jìn)行特性修改的時機(jī)。_attrs 兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問在類內(nèi)部的方法中使用時 self._attrs第37頁,共63頁。類的私有屬性單下劃線 開始的成員變量叫做保護(hù)變量,意思是只有類對象和子類對象自己能訪問到這些變量;“雙下劃線” 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數(shù)據(jù)。例如:_foo的代表不能直接訪問的類屬性,

17、需通過類提供的接口進(jìn)行訪問,不能用“from xxx import *”導(dǎo)入;以雙下劃線開頭的_foo代表類的私有成員;以雙下劃線開頭和結(jié)尾的_foo_代表python里特殊方法專用的標(biāo)識,如 _init_()代表類的構(gòu)造函數(shù)。第38頁,共63頁。類的私有方法在類的內(nèi)部,使用def關(guān)鍵字可以為類定義一個方法,與一般函數(shù)定義不同,類方法必須包含參數(shù)self,且為第一個參數(shù)。類的私有方法_method兩個下劃線開頭,聲明該方法為私有方法,不能在類的外部調(diào)用在類的內(nèi)部調(diào)用slef._methods第39頁,共63頁。類的私有方法class Secretive: def _inaccessible(s

18、elf): print today is sunny def accessible(self): print the secret message is: self._inaccessible()_inaccessible從外界是無法訪問的,而在類內(nèi)部還能使用第40頁,共63頁。檢查繼承查看一個類是否是另一個的子類,可以使用內(nèi)建的issubclass函數(shù):issubclass(SPAMFilter,Filter)如果想要知道已知類的基類,可以直接使用它的特殊特性_bases_:SPAMFilter._bases_使用isinstance方法檢索一個對象是否是一個類的實(shí)例:isinstance(

19、s,SPAMFilter)如果只想知道一個對象屬于哪個類, 可以使用_class_屬性:s. _class_第41頁,共63頁。Python內(nèi)置類屬性_dict_ : 類的屬性(包含一個字典,由類的數(shù)據(jù)屬性組成)_doc_ :類的文檔字符串_name_: 類名_module_: 類定義所在的模塊(類的全名是_main_.className,如果類位于一個導(dǎo)入模塊mymod中,那么className._module_ 等于 mymod)_bases_ : 類的所有父類構(gòu)成元素(包含了一個由所有父類組成的元組)第42頁,共63頁。指定超類將其它類名寫在class語句后的圓括號內(nèi)可以指定超類clas

20、s Filter:class SPAMFilter(Filter):第43頁,共63頁。指定超類class Filter: def init(self): self.blocked= def filter(self,sequence): return x for x in sequence if x not in self.blockedclass SPAMFilter(Filter): def init(self): self.blocked=SPAMf=Filter()f.init()print f.filter(1,2,3)s=SPAMFilter()s.init()print s.fi

21、lter(SPAM,SPAM,SPAM,SPAM,eggs,bacon,SPAM)第44頁,共63頁。多個超類class Calculator: def calculate(self,expression): self.value=eval(expression)class Talker: def talk(self): print hi, my value is ,self.valueclass TalkingCalculate(Calculator,Talker): passtc=TalkingCalculate()tc.calculate(1+2*3)tc.talk()eval()功能:

22、將字符串str當(dāng)成有效的表達(dá)式來求值并返回計算結(jié)果。多重繼承第45頁,共63頁。多個繼承class Calculator: def talk(self): print hi, I am at firstclass Talker: def talk(self): print hi, I am at second,class TalkingCalculate(Calculator,Talker): passtc=TalkingCalculate()tc.talk()當(dāng)使用多重繼承時,如果一個方法從多個超類繼承,應(yīng)該注意超類的順序,先繼承的類中的方法會重寫后繼承類中的方法第46頁,共63頁。# -*

23、- coding: UTF-8 -*-class Parent: # 定義父類 parentAttr = 100 def _init_(self): print 調(diào)用父類構(gòu)造函數(shù) def parentMethod(self): print 調(diào)用父類方法 def setAttr(self, attr): Parent.parentAttr = attr def getAttr(self): print 父類屬性 :, Parent.parentAttrclass Child(Parent): # 定義子類 def _init_(self): print 調(diào)用子類構(gòu)造方法 def childMet

24、hod(self): print 調(diào)用子類方法c = Child() # 實(shí)例化子類c.childMethod() # 調(diào)用子類的方法c.parentMethod() # 調(diào)用父類方法c.setAttr(200) # 再次調(diào)用父類的方法c.getAttr() # 再次調(diào)用父類的方法第47頁,共63頁。方法重寫如果父類方法的功能不能滿足需求,可以在子類重寫父類的方法:# -*- coding: UTF-8 -*-class Parent: # 定義父類 def myMethod(self): print 調(diào)用父類方法class Child(Parent): # 定義子類 def myMethod

25、(self): print 調(diào)用子類方法c = Child() # 子類實(shí)例c.myMethod() # 子類調(diào)用重寫方法第48頁,共63頁。重寫一般方法和特殊的構(gòu)造方法class A: def hello(self): print I am Aclass B(A): passclass A: def hello(self): print I am Aclass B(A): def hello(self): print I am Ba=A()b=B()a.hello()b.hello()第49頁,共63頁。重寫一般方法和特殊的構(gòu)造方法class Bird: def _init_(self):

26、self.hungry=True def eat(self): if self.hungry: print eating self.hungry=False else: print No,thanksclass SongBird(Bird): def _init_(self): Bird._init_(self) self.sound=singing def sing(self): print self.sound第50頁,共63頁。重寫一般方法和特殊的構(gòu)造方法class Bird: def _init_(self): self.hungry=True def eat(self): if se

27、lf.hungry: print eating self.hungry=False else: print No,thanksclass SongBird(Bird): def _init_(self): super(SongBird,self)._init_() self.sound=singing def sing(self): print self.sound第51頁,共63頁。定義一個列表的操作類:Listinfo包括的方法:列表元素添加:add_key(keyname)keyname:字符串或者整數(shù)類型列表元素取值:get_key(num)num:整數(shù)類型列表合并:update_li

28、st(list)list:列表類型刪除并且返回最后一個元素:del_key()list_info=Listinfo(44,222,111,333,454,sss,333)第52頁,共63頁。class Listinfo(): def _init_(self, list_val): self.varlist = list_val def add_key(self, key_name): if isinstance(key_name, (str, int): self.varlist.append(key_name) return self.varlist else: return error d

29、ef get_key(self, num): if num = 0 and num = 0: return self.varlist.pop(-1) else: return error list_info = Listinfo(44, 222, 111, 333, 454, sss, 333) print list_info.add_key(1111) print list_info.get_key(4) print list_info.update_list(1, 2, 3) print list_info.del_key() 第53頁,共63頁。集合我們已經(jīng)遇到了很多數(shù)據(jù)結(jié)構(gòu),如字典(散

30、列表),列表,元組等,這些都是程序語言中必不可不少的一部分。集合:在python2.3之前Set類型位于sets模塊中,在python2.3之后,集合通過set類型的實(shí)現(xiàn)成為了語言的一部分。第54頁,共63頁。集合直接創(chuàng)建集合: set(range(10)-set(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)集合是由序列或者其他可迭代對象構(gòu)建的。它們主要用于檢查成員資格,因此副本是被忽略的。與字典一樣,集合元素的順序是隨意的,因此,不應(yīng)該以元素的順序作為編程的依據(jù)。第55頁,共63頁。集合集合是由序列或者其他可迭代對象構(gòu)建的。它們主要用于檢查成員資格,因此副本是被忽略的。 set

31、(0, 1, 2, 3, 0,1,2,3)-set(0, 1, 2, 3)與字典一樣,集合元素的順序是隨意的,因此,不應(yīng)該以元素的順序作為編程的依據(jù)。第56頁,共63頁。集合與字典一樣,集合元素的順序是隨意的,因此,不應(yīng)該以元素的順序作為編程的依據(jù)。 set(fee,fie,foe)-set(foe, fee, fie)第57頁,共63頁。集合還可以使用標(biāo)準(zhǔn)的集合操作,并集:使用一個集合的union方法或者接位與運(yùn)算符| a=set(1,2,3) b=set(2,3,4) a.union(b)set(1, 2, 3, 4) a|bset(1, 2, 3, 4)第58頁,共63頁。集合-注意:集

32、合元素順序是隨意的,不能做為編碼的依據(jù)。集合是不可變的,不能用做字典中的鍵。集合本身只能包含不可變的值,所以不能包含其他集合。 a.add(frozenset(b) aset(1, 2, 3, frozenset(2, 3, 4)第59頁,共63頁。定義一個集合的操作類:Setinfo包括的方法:集合元素添加:add_setinfo(keyname),其中keyname:字符串或者整數(shù)類型集合的交集:get_intersection(unioninfo) ,其中unioninfo是集合類型集合的并集:get_union(unioninfo) ,其中unioninfo是集合類型集合的差集:del

33、_difference(unioninfo) ,其中unioninfo是集合類型set_info=Setinfo(你要操作的集合)第60頁,共63頁。class Setinfo(object): def _init_(self, my_Set): self.Sett = my_Set def add_setinfo(self, keyname): if isinstance(keyname, (int, str): self.Sett.add(keyname) return self.Sett return error def get_intersection(self, unioninfo)

34、: if isinstance(unioninfo, set): return self.Sett & unioninfo return error def get_union(self, unioninfo): if isinstance(unioninfo, set): return self.Sett | unioninfo return error def del_difference(self, unioninfo): if isinstance(unioninfo, set): return self.Sett - unioninfo return error A = set(1, 2, 3, 4, 5, 2) B = set(5, 6, 3) set_info = Setinfo(A) print set_info.add_setinfo(f) print set_info.get_intersection(B) print set_info.get_union(B) print set_info.del_difference(B) 第61頁,共63頁。練習(xí)定義一個SchoolMember類,具有

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論