Python程序設(shè)計基礎(chǔ)及應(yīng)用 課件 第7章 面向?qū)ο蟪绦蛟O(shè)計_第1頁
Python程序設(shè)計基礎(chǔ)及應(yīng)用 課件 第7章 面向?qū)ο蟪绦蛟O(shè)計_第2頁
Python程序設(shè)計基礎(chǔ)及應(yīng)用 課件 第7章 面向?qū)ο蟪绦蛟O(shè)計_第3頁
Python程序設(shè)計基礎(chǔ)及應(yīng)用 課件 第7章 面向?qū)ο蟪绦蛟O(shè)計_第4頁
Python程序設(shè)計基礎(chǔ)及應(yīng)用 課件 第7章 面向?qū)ο蟪绦蛟O(shè)計_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第7章面向?qū)ο蟪绦蛟O(shè)計1.理解面向?qū)ο蟪绦蛟O(shè)計的基本思想2.掌握類的定義和實例化3.掌握類的繼承和多態(tài)的實現(xiàn)方法4.理解彈球游戲的設(shè)計思路和實現(xiàn)過程學(xué)習(xí)目標面向?qū)ο蟪绦蛟O(shè)計(ObjectOrientedProgramming,OOP)主要針對大型軟件設(shè)計而提出,使得軟件設(shè)計更加靈活,能夠很好地支持代碼復(fù)用和設(shè)計復(fù)用,并且使得代碼具有更好的可讀性和可擴展性。面向?qū)ο蟪绦蛟O(shè)計的一條基本原則是計算機程序由多個能夠起到子程序作用的單元或?qū)ο蠼M合而成,這大大地降低了軟件開發(fā)的難度,使得編程就像搭積木一樣簡單。面向?qū)ο蟪绦蛟O(shè)計的一個關(guān)鍵性觀念是將數(shù)據(jù)以及對數(shù)據(jù)的操作封裝在一起,組成一個相互依存、不可分割的整體,即對象。對于相同類型的對象進行分類、抽象后,得出共同的特征而形成了類,面向?qū)ο蟪绦蛟O(shè)計的關(guān)鍵就是如何合理地定義和組織這些類以及類之間的關(guān)系。7.1面向?qū)ο蟪绦蛟O(shè)計概述7.1面向?qū)ο蟪绦蛟O(shè)計概述Python完全采用了面向?qū)ο蟪绦蛟O(shè)計的思想,是真正面向?qū)ο蟮母呒墑討B(tài)編程語言,完全支持面向?qū)ο蟮幕竟δ埽绶庋b、繼承、多態(tài)以及對基類方法的覆蓋或重寫。Python中對象的概念很廣泛,Python中的一切內(nèi)容都可以稱為對象,除了數(shù)字、字符串、列表、元組、字典、集合、range對象、zip對象等等,函數(shù)也是對象,類也是對象。創(chuàng)建類時用變量形式表示的對象屬性稱為數(shù)據(jù)成員,用函數(shù)形式表示的對象行為稱為成員方法,成員屬性和成員方法統(tǒng)稱為類的成員。7.2類的定義Python使用class關(guān)鍵字來定義類,class關(guān)鍵字之后是一個空格,然后是類的名字,再然后是一個冒號,最后換行并定義類的內(nèi)部實現(xiàn)。類名的首字母一般要大寫,當然也可以按照自己的習(xí)慣定義類名,但一般推薦參考慣例來命名,并在整個系統(tǒng)的設(shè)計和實現(xiàn)中保持風(fēng)格一致,這一點對于團隊合作尤其重要。class類名: 類成員 類方法7.2類的定義classDog():name="二哈"#類成員

defsit(self):#類方法

print(+"現(xiàn)在正在坐著")

defroll_over(self):#類方法

print(+"在打滾")my_dog=Dog()#類實例化my_dog.sit()my_dog.roll_over()7.2類的定義Python提供了一個關(guān)鍵字“pass”,類似于空語句,可以用在類和函數(shù)的定義中或者選擇結(jié)構(gòu)中。當暫時沒有確定如何實現(xiàn)功能,或者為以后的軟件升級預(yù)留空間,或者其他類型功能時,可以使用該關(guān)鍵字來“占位”。>>>classA: pass>>>defdemo(): pass>>>if5>3: pass7.3類的屬性和方法類的所有實例方法都必須至少有一個名為self的參數(shù),并且必須是方法的第一個形參(如果有多個形參的話),self參數(shù)代表將來要創(chuàng)建的對象本身。在類的實例方法中訪問實例屬性時需要以self為前綴,但在外部通過對象名調(diào)用對象方法時并不需要傳遞這個參數(shù),如果在外部通過類名調(diào)用對象方法則需要顯式為self參數(shù)傳值。7.3類的屬性和方法7.3類的屬性和方法屬于實例的數(shù)據(jù)成員一般是指在構(gòu)造函數(shù)__init__()中定義的,定義和使用時必須以self作為前綴;屬于類的數(shù)據(jù)成員是在類中所有方法之外定義的。在主程序中(或類的外部),實例屬性屬于實例(對象),只能通過對象名訪問;而類屬性屬于類,可以通過類名或?qū)ο竺L問。7.3類的屬性和方法classDog():name="二哈"

def__init__(self,age,sex):self.age=ageself.sex=sexdefsit(self):print(+"現(xiàn)在正在坐著")

defroll_over(self):print(+"在打滾")

defdoginfo(self):print("我家有一條"+str(self.age)+"歲大的小狗,名字叫"+)7.3類的屬性和方法my_dog=Dog(3,"boy")#類實例化my_dog.doginfo()print(D)#使用類名訪問類成員變量print(my_dog.age)#使用對象名訪問對象成員變量print(my_dog.__sex)#這句會出錯,因為sex是私有的7.3類的屬性和方法Python并沒有對私有成員提供嚴格的訪問保護機制。在定義類的成員時,如果成員名以兩個下劃線“__”開頭則表示是私有成員。私有成員在類的外部不能直接訪問,需要通過調(diào)用對象的公有成員方法來訪問,也可以通過Python支持的特殊方式來訪問。公有成員既可以在類的內(nèi)部進行訪問,也可以在外部程序中使用。7.3類的屬性和方法在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其是在類的定義中。用下劃線作為變量名和方法名前綴和后綴來表示類的特殊成員:_xxx:受保護成員,不能用'frommoduleimport*'導(dǎo)入;__xxx__:系統(tǒng)定義的特殊成員;__xxx:私有成員,只有類對象自己能訪問,子類對象不能直接訪問到這個成員,但在對象外部可以通過“對象名._類名__xxx”這樣的特殊方式來訪問。注意:Python中不存在嚴格意義上的私有成員。7.3類的屬性和方法下面的代碼演示了特殊成員定義和訪問的方法:>>>classFruit:def__init__(self):self.__color='Red'self.price=1>>>apple=Fruit()>>>apple.price#顯示對象公開數(shù)據(jù)成員的值1>>>apple.price=2#修改對象公開數(shù)據(jù)成員的值>>>apple.price2'>>>print(apple.price,apple._Fruit__color)#顯示對象私有數(shù)據(jù)成員的值2Red>>>apple._Fruit__color="Blue"#修改對象私有數(shù)據(jù)成員的值>>>print(apple.price,apple._Fruit__color)2Blue>>>print(apple.__color)#不能直接訪問對象的私有數(shù)據(jù)成員,出錯AttributeError:Fruitinstancehasnoattribute'__color7.3類的屬性和方法7.3類的屬性和方法Python類有大量的特殊方法,其中比較常見的是構(gòu)造函數(shù)和析構(gòu)函數(shù),除此之外,Python還支持大量的特殊方法,運算符重載就是通過重寫特殊方法實現(xiàn)的。Python中類的構(gòu)造函數(shù)是__init__(),一般用來為數(shù)據(jù)成員設(shè)置初值或進行其他必要的初始化工作,在創(chuàng)建對象時被自動調(diào)用和執(zhí)行。如果用戶沒有設(shè)計構(gòu)造函數(shù),Python將提供一個默認的構(gòu)造函數(shù)用來進行必要的初始化工作。Python中類的析構(gòu)函數(shù)是__del__(),一般用來釋放對象占用的資源,在Python刪除對象和收回對象空間時被自動調(diào)用和執(zhí)行。如果用戶沒有編寫析構(gòu)函數(shù),Python將提供一個默認的析構(gòu)函數(shù)進行必要的清理工作。7.3類的屬性和方法編號方法功能1__new__()類的靜態(tài)方法,用于確定是否要創(chuàng)建對象。2__init__()構(gòu)造方法,創(chuàng)建對象時自動調(diào)用。3__del__()析構(gòu)方法,釋放對象時自動調(diào)用。4__getattribute__()獲取對象指定屬性的值,如果同時定義了該方法與__getattr__(),那么__getattr__()將不會被調(diào)用。5__dict__對象所包含的屬性與值的字典。6__get__(),__set__()描述符對象一般作為其他類的屬性來使用,分別在獲取屬性、修改屬性值被調(diào)用。小游戲classPerson:def__init__(self,na,gen,age,fig):=naself.gender=gen

self.age=ageself.fight=figdefgrassland(self):"""注釋:草叢戰(zhàn)斗,消耗200戰(zhàn)斗力"""self.fight=self.fight-200defpractice(self):"""注釋:自我修煉,增長100戰(zhàn)斗力"""self.fight=self.fight+200defincest(self):"""注釋:多人游戲,消耗500戰(zhàn)斗力"""self.fight=self.fight-500defdetail(self):"""注釋:當前對象的詳細情況"""temp="姓名:%s;性別:%s;年齡:%s;戰(zhàn)斗力:%s"%(,self.gender,self.age,self.fight)printtempcang=Person('星矢','女',18,1000)#創(chuàng)建星矢角色dong=Person('紫龍','男',20,1800)#創(chuàng)建紫龍角色bo=Person('鳴人','女',19,2500)#創(chuàng)建鳴人角色cang.incest()#星矢參加一次多人游戲dong.practice()#紫龍自我修煉了一次bo.grassland()#鳴人參加一次草叢戰(zhàn)斗#輸出當前所有人的詳細情況cang.detail()dong.detail()bo.detail()cang.incest()#星矢又參加一次多人游戲dong.incest()#紫龍也參加了一個多人游戲bo.practice()#鳴人自我修煉了一次#輸出當前所有人的詳細情況cang.detail()dong.detail()bo.detail()7.4繼承和多態(tài)繼承是為代碼復(fù)用和設(shè)計復(fù)用而設(shè)計的,是面向?qū)ο蟪绦蛟O(shè)計的重要特性之一。設(shè)計一個新類時,如果可以繼承一個已有的設(shè)計良好的類然后進行二次開發(fā),無疑會大幅度減少開發(fā)工作量。在繼承關(guān)系中,已有的、設(shè)計好的類稱為父類或基類,新設(shè)計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。如果需要在派生類中調(diào)用基類的方法,可以使用內(nèi)置函數(shù)super()或者通過“基類名.方法名()”的方式來實現(xiàn)這一目的。7.4繼承和多態(tài)所謂多態(tài)(polymorphism),是指基類的同一個方法在不同派生類對象中具有不同的表現(xiàn)和行為。派生類繼承了基類行為和屬性之后,還會增加某些特定的行為和屬性,同時還可能會對繼承來的某些行為進行一定的改變,這都是多態(tài)的表現(xiàn)形式。例如python大多數(shù)運算符可以作用于多種不同類型的操作數(shù),并且對于不同類型的操作數(shù)往往有不同的表現(xiàn),這就是多態(tài)。7.4繼承和多態(tài)classAnimal:def__init__(self,name,sex,age):=nameself.sex=sexself.age=agedefeat(self):print("%seat"%)defdrink(self):print("%sdrink"%)defshit(self):print("%sout"%)defpee(self):print("%spee"%)defcry(self):pass7.4繼承和多態(tài)classCat(Animal):def__init__(self,name,sex,age,chara):super(Cat,self).__init__(name,sex,age)self.chara=charadefcry(self):print('%s喵喵叫'%)classDog(Animal):def__init__(self,name,sex,age,pinzhong):super(Dog,self).__init__(name,sex,age)self.pinzhong=pinzhongdeftail(self):print('%s搖尾巴!'%)defcry(self):print('%s汪汪叫'%)7.4繼承和多態(tài)c1=Cat('加菲貓',"公",10,"活潑")c1.eat()c1.cry()c2=Dog('小黑',"公",3,"金毛")c2.tail()c2.cry()7.5綜合案例-彈球游戲游戲界面(界面標題命名,界面大小控制);小球類(小球類構(gòu)造函數(shù),小球上下運動,小球左右運動,小球隨機運動,小球反彈控制,小球速度控制,小球個數(shù)控制,小球大小控制);球拍類(球拍類構(gòu)造函數(shù),鍵盤事件,球拍速度控制,球拍大小控制,球拍碰撞檢測)7.5綜合案例-彈球游戲7.5綜合案例-彈球游戲fromTkinterimport*#界面設(shè)計tk=Tk()tk.title("Game")tk.resizable(0,0)tk.wm_attributes("-topmost",1)canvas=Canvas(tk,width=500,height=400,bd=0,highlightthickness=0)canvas.pack()tk.update()7.5綜合案例-彈球游戲7.5綜合案例-彈球游戲1.請設(shè)置窗體的名字為“BallGame”。2.設(shè)置窗體大小為800,600。3.tk.update()是什么意思?4.tk.resizable(0,0)是什么意思?7.5綜合案例-彈球游戲classPaddle:#球拍類設(shè)計def__init__(self,canvas,color,x,y):self.canvas=canvasself.id=canvas.create_rectangle(0,0,100,10,fill=color)self.canvas.move(self.id,x,y)self.x=0self.canvas_width=self.canvas.winfo_width()self.canvas.bind_all('<KeyPress-Left>',self.turn_left)#綁定鍵盤左鍵到self.turn_left參數(shù)上

self.canvas.bind_all('<KeyPress-Right>',self.turn_right)7.5綜合案例-彈球游戲defturn_left(self,evt):self.x=-3defturn_right(self,evt):self.x=3defdraw(self):self.canvas.move(self.id,self.x,0)pos=self.canvas.coords(self.id)ifpos[0]<=0:self.x=0elifpos[2]>=self.canvas_width:self.x=07.5綜合案例-彈球游戲7.5綜合案例-彈球游戲1.繪制球拍類類圖。2.self.id=canvas.create_rectangle(0,0,100,10,fill=color)什么意思?3.怎么修改代碼,讓球拍變長一些。4.怎么修改代碼,讓球拍出現(xiàn)在右下角位置7.5綜合案例-彈球游戲classBall:#小球類設(shè)計def__init__(self,canvas,paddle,color):self.canvas=canvasself.paddle=paddleself.id=canvas.create_oval(10,10,25,25,fill=color)self.canvas.move(self.id,random.randint(0,500),random.randint(0,500))self.x=random.randint(0,20)self.y=-random.randint(0,20)self.canvas_height=self.canvas.winfo_height()self.canvas_width=self.canvas.winfo_width()self.hit_bottom=False7.5綜合案例-彈球游戲defdraw(self):self.canvas.move(self.id,self.x,self.y)pos=self.canvas.coords(self.id)#獲取小球的位置

#屏幕左上角的位置為pos[0],pos[1];屏幕右上角的位置為pos[2],pos[3]ifpos[1]<=0:self.y=3#當小球到達屏幕上方時,小球下移

ifpos[0]<=0:#當小球到達屏幕左方時,小球右移

self.x=3ifpos[2]>=self.canvas_width:self.x=-3

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論