版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
第6單元
面向對象(上)任務6.1純畫筆彈球任務6.2純畫筆彈球改造任務6.3純畫筆彈球改造學習目標知識目標技能目標素質目標
理解OOP的概念。
理解類和對象的概念和關系。
掌握類的定義方法。
掌握對象的創(chuàng)建與使用方法。
掌握類的成員訪問方法。
掌握類的構造方法和析構方法的作用。
能用面向對象的思想設計程序。
能根據(jù)需求設計類和創(chuàng)建對象。
能夠在定義類時合理設置類成員的訪問限制。
能夠在定義類時正確使用構造方法和析構方法。培養(yǎng)標準化的編碼規(guī)范能力。
培養(yǎng)創(chuàng)新能力以及分析問題和解決問題的能力。
培養(yǎng)團隊意識和溝通能力。教學內(nèi)容任務6.1純畫筆彈球一、任務描述運動的球碰到墻壁會彈回,使用海龜作圖庫turtle實現(xiàn)純畫筆彈球動畫,一只紅色的小球,在白色的畫布中移動,碰到邊界自動彈回,效果如圖所示。
面向對象是程序開發(fā)領域中的重要思想,這種思想模擬了人類認識客觀世界的邏輯,是當前計算機軟件工程學的主流方法。類是面向對象的實現(xiàn)手段。二、相關知識1.面向對象概述
面向對象編程的基本思想是:首先會從問題之中提煉出問題涉及的角色,將不同角色各自的特征和關系進行封裝,以角色為主體,通過描述角色的行為去描述解決問題的過程。面向對象編程的著眼之處在于角色以及角色之間的聯(lián)系。!二、相關知識對象是現(xiàn)實世界中可描述的事物,它可以是有形的也可以是無形的,從一本書到一家圖書館,從單個整數(shù)到繁雜的序列等都可以稱為對象。(1)對象(object)二、相關知識對象是構成世界的一個獨立單位,它由數(shù)據(jù)(描述事物的屬性)和作用于數(shù)據(jù)的操作(體現(xiàn)事物的行為)構成一個獨立整體。(1)對象(object)數(shù)據(jù)對象操作二、相關知識從具體的事物中把共同的特征抽取出來,形成一般的概念稱為“歸類”,忽略事物的非本質特牲,關注與目標有關的本質特征,找出事物間的共性,抽象出一個概念模型,就是定義一個類。(2)類(class)動物類二、相關知識在面向對象的方法中,類是具有相同屬性和行為的一組對象的集合,它提供一個抽象的描述,其內(nèi)部包括屬性和方法兩個主要部分,它就像一個模具,可以用它鑄造一個個具體的鑄件。(2)類(class)二、相關知識(3)三大特征:封裝、繼承、多態(tài)是面向對象程序設計的三大特征,它們的簡單關系如下圖所示。二、相關知識封裝(encapsulation)封裝是面向對象的核心思想,將對象的屬性和行為封裝起來,不需要讓外界知道具體實現(xiàn)細節(jié),這就是封裝思想。二、相關知識繼承(inheritance)繼承描述的是類與類之間的關系,通過繼承,新生類可以在無需贅寫原有類的情況下,對原有類的功能進行擴展。汽車類普通特性與功能轎車類普通特性與功能其它特性與功能繼承二、相關知識多態(tài)(
polymorphism)多態(tài)指同一個屬性或行為在父類及其各派生類中具有不同的語義。二、相關知識面向對象的思想中提出了兩個概念:類和對象。類類是對多個對象共同特征的抽象描述,它是對象的模板。對象對象用于描述現(xiàn)實中的個體,它是類的實例。二、相關知識2.類與對象(1)類與對象的關系
廠商在生產(chǎn)汽車之前會先分析用戶需求,設計汽車模型,制作設計圖樣,設計圖通過之后工廠再依照圖紙批量生產(chǎn)汽車。二、相關知識Python中對象的概念較廣泛,一切內(nèi)容皆可以稱為對象,函數(shù)也是對象。在創(chuàng)建類時,類的成員包含以下兩部分。用變量形式表示對象特征的成員稱為數(shù)據(jù)成員,也稱為屬性(attribute)。用函數(shù)形式表示對象行為的成員稱為成員函數(shù),也稱為方法(method)。數(shù)據(jù)成員和成員函數(shù)統(tǒng)稱為類的成員。二、相關知識類中可以定義數(shù)據(jù)成員和成員函數(shù),數(shù)據(jù)成員用于描述對象特征,成員函數(shù)用于描述對象行為,其中數(shù)據(jù)成員也被稱為屬性,成員函數(shù)也被稱為方法。class類名:
屬性名=屬性值def方法名(self):
方法體classCircle: #類名為Circler=5 #屬性r的初始值為5defget_area(self):#定義求面積的方法return3.14*self.r*self.rdefget_perimeter(self):#定義求周長的方法return2*3.14*self.r二、相關知識(2)類的定義
類定義完成后不能直接使用,這就好比畫好了一張房屋設計圖紙,此圖紙只能幫助人們了解房屋的結構,但不能提供居住場所。為滿足居住需求,需要根據(jù)房屋設計圖紙搭建實際的房屋。同理,程序中的類需要實例化為對象才能實現(xiàn)其意義。二、相關知識(3)對象的創(chuàng)建與使用對象的創(chuàng)建創(chuàng)建對象的格式如下:對象名=類名()circle01=Circle()circle02=Circle()二、相關知識訪問對象成員若想在程序中真正地使用對象,需掌握訪問對象成員的方式。對象成員分為屬性和方法,它們的訪問格式分別如下:對象名.屬性對象名.方法()circle02.r=10#設置圓circle02的半徑為10print(circle01.get_perimeter())#輸出圓circle01的周長print(circle01.get_area())#輸出圓circle01的面積print(circle02.get_perimeter())#輸出圓circle02的周長print(circle02.get_area())#輸出圓circle02的面積二、相關知識三、任務分析
該任務實現(xiàn)的動畫效果體現(xiàn)了動畫的基本原理。將小球看作一個對象,分析其屬性和行為特征。首先,小球具有大小、顏色、位置(x、y)屬性,其次,小球移動的速度也是其屬性之一,可將移動速度分為橫向(x軸)和縱向(y軸)兩個方向。分析小球的行為,包括移動到新的位置、碰到邊界反彈等。
對于小球移動的速度,除了可以設置其移動速度屬性外,還可以配合使用time庫中的sleep(),使移動更流暢、逼真。四、任務實現(xiàn)(1)在PyCharm中,選擇“File”→“NewProject…”,在彈出的對話框中將項目命名為“chapter06”,單擊“Create”按鈕,創(chuàng)建新項目。(2)在PyCharm中,右擊左側列表中的項目名稱chapter06,選擇“New”→“PythonFile”,在彈出的對話框中將文件命名為“6-1純畫筆彈球.py”,按“Enter”鍵,進入代碼編輯界面。(3)在新建文件中導入庫。除了導入海龜作圖庫turtle,還要導入可能用到的time庫和random庫,以控制小球的運行速度。importtime #導入time庫importturtleast #導入turtle庫importrandom #導入random庫四、任務實現(xiàn)(4)定義球類,類名為Ball,其屬性有直徑(配合turtle庫的dot()函數(shù)使用,該函數(shù)的參數(shù)是直徑)diameter、顏色color、位置坐標x和y、移動速度dx和dy。classBall:diameter=100 #設定直徑為100dx=random.randint(-10,10) #單位水平移動速度,取-10~10的隨機數(shù)dy=random.randint(-10,10) #單位垂直移動速度,取-10~10的隨機數(shù)x=t.xcor() #球的位置,初始值為海龜?shù)膞坐標y=t.ycor() #球的位置,初始值為海龜?shù)膟坐標color='red' #球的顏色,默認為紅色四、任務實現(xiàn)(5)定義類Ball的移動方法move():通過將海龜?shù)膞坐標、y坐標分別加上單位水平移動速度、單位垂直移動速度計算出新的位置坐標,將海龜移動到新位置,設置海龜?shù)念伾珵榍虻念伾?,在新的位置上繪制實心圓,實心圓的直徑為球的直徑。defmove(self): #定義move()方法self.x=self.x+self.dx #計算海龜?shù)男挛恢玫膞坐標self.y=self.y+self.dy #計算海龜?shù)男挛恢玫膟坐標t.goto(self.x,self.y) #將海龜移動到新位置t.color(self.color) #設置海龜?shù)念伾玹.dot(self.diameter) #畫個點四、任務實現(xiàn)(6)定義類Ball的反彈方法bounce_on_edge():球碰到邊界反彈實際上是將單位移動速度取反,即原來為正值則變?yōu)樨撝?,原來為負值則變?yōu)檎怠E袛嗍欠衽龅竭吔缧枰玫疆嫴紝挾群透叨?,可以通過window_width()和window_height()函數(shù)獲得。defbounce_on_edge(self): #定義反彈方法#如果球的中心點x坐標大于1/2畫布寬度-半徑,則取反ifabs(self.x)>t.window_width()//2-self.diameter//2:self.dx=-self.dx#如果球的中心點y坐標大于1/2畫布高度-半徑,則取反ifabs(self.y)>t.window_height()//2-self.diameter//2:self.dy=-self.dy四、任務實現(xiàn)(7)定義完類后,創(chuàng)建一個對象,關閉自動刷新功能,抬起海龜畫筆,隱藏形狀,為后續(xù)小球移動做好準備。(8)實現(xiàn)小球移動功能,其實現(xiàn)原理為:擦除畫布,小球移動到新位置,如果碰到邊界則反彈,刷新畫布,控制球的速度,如此重復執(zhí)行。代碼如下:ball=Ball()t.tracer(0) #關閉自動刷新功能t.penup() #抬起畫筆t.hideturtle() #和本身形狀無關,所以隱藏whileTrue: t.clear() #擦除畫布ball.move() #移動到新位置繪制點ball.bounce_on_edge() #遇到邊界反彈t.update() #刷新畫布time.sleep(0.01) #配合使用sleep()控制球的速度任務6.2純畫筆彈球改造一、任務描述
任務6.1中已經(jīng)實現(xiàn)了純畫筆彈球,在其基礎上對代碼進行優(yōu)化,如在判斷是否觸碰邊界時用到了半徑,因此可以在類中增加半徑,也可以將判斷是否觸碰邊界寫成單獨的方法。
類中定義的屬性和方法默認為公有屬性和方法,該類的對象可以任意訪問類的公有成員。為了契合封裝原則,保證類中的代碼不被外部代碼輕易訪問。Python支持將類中的成員設置為私有成員,在一定程度上限制對象對類成員的訪問。二、相關知識1.類的成員訪問限制定義私有成員Python通過在類成員名之前添加雙下劃線(__)來限制成員的訪問權限,語法格式如下:__屬性名=屬性值__方法名(self):
方法體二、相關知識例如,定義一個包含私有屬性__pi和私有方法__info()的類Circle。classCircle:r=5__pi=3.14def__info(self):print(f'我是一個半徑為
{self.r}的圓!')訪問私有成員創(chuàng)建Circle類的對象crl,通過該對象訪問類的私有屬性:crl=Circle()crl.__piAttributeError:Circle'objecthasnoattribute‘__pi'二、相關知識訪問私有成員在程序中添加如下的訪問類中私有方法的代碼:crl=Circle()crl.__info()AttributeError:Circle'objecthasnoattribute'__info'二、相關知識由以上展示的錯誤信息可以判斷,對象無法直接訪問類的私有成員。結論二、相關知識classCircle:r=5#定義公有屬性__pi=3.14#定義私有屬性def__info(self):#定義私有方法,在私有方法中訪問公有屬性和私有屬性print(f'我是一個半徑為{self.r}的圓,有一個私有屬性pi,其值為{self.__pi}!’)defget_perimeter(self):return2*self.__pi*self.rcrl=Circle()crl.get_perimeter()私有屬性可在公有方法中通過指代對象本身的默認參數(shù)“self”訪問,類外部可通過公有方法間接獲取類的私有屬性。二、相關知識classCircle:r=5#定義公有屬性__pi=3.14#定義私有屬性def__info(self):#定義私有方法,在私有方法中訪問公有屬性和私有屬性print(f'我是一個半徑為{self.r}的圓,有一個私有屬性pi,其值為{self.__pi}!')defget_area(self):#定義公有方法self.__info()#在公有方法中訪問私有方法returnself.__pi*self.r*self.r#在公有方法中訪問私有屬性defget_perimeter(self):return2*self.__pi*self.rcrl=Circle()crl.get_area()私有方法同樣在公有方法中通過參數(shù)“self”訪問。二、相關知識三、任務分析
因為半徑是直徑的1/2,可以直接計算出來,最好不要對其進行修改,所以將半徑設置為私有屬性更為合理。判斷是否觸碰邊界只在方法bounce_
on_edge()中用到,在類的內(nèi)部使用,所以也可以將其設置為私有方法。四、任務實現(xiàn)(1)在PyCharm的左側項目列表中,右擊文件“6-1純畫筆彈球.py”,在彈出的快捷菜單中選擇“Copy”,復制該Python文件。(2)在PyCharm的左側項目列表中,右擊項目名稱“chapter06”,在彈出的快捷菜單中選擇“Paste”,即在項目中粘貼復制的Python文件,并取名為“6-2純畫筆彈球.py”,如圖6-5所示,單擊“OK”按鈕,完成文件的復制。(3)在新的Python文件“6-2純畫筆彈球.py”中修改類Ball的定義,增加私有屬性半徑__raduis,增加判斷是否左右碰壁私有方法__isBounce_left_right()和上下碰壁的私有方法__isBounce_top_bottom()。四、任務實現(xiàn)(4)修改反彈方法bounce_on_edge(),在其內(nèi)部調用私有方法。(5)創(chuàng)建好Ball的對象后,也可以通過對象來修改屬性,如直徑、顏色和移動速度等。(6)其他代碼不做修改,運行程序,發(fā)現(xiàn)小球顏色和大小都發(fā)生了變化。defbounce_on_edge(self):#定義反彈方法#如果球的中心點x坐標大于1/2畫布寬度-半徑,則取反ifself.__isBounce_left_right():#調用私有方法進行判斷self.dx=-self.dx#如果球的中心點y坐標大于1/2畫布高度-半徑,則取反ifself.__isBounce_top_bottom():#調用私有方法進行判斷self.dy=-self.dyball=Ball() #創(chuàng)建對象ball.diameter=50 #設置球的直徑為50ball.dx=8 #設置單位水平移動速度為8ball.dy=5 #設置單位垂直移動速度為5ball.color='yellow' #設置球的顏色為黃色任務6.3純畫筆彈球改造一、任務描述
任務6.1已經(jīng)實現(xiàn)了純畫筆彈球。在任務6.1中,Ball類的屬性實際上為類屬性。請對程序進行修改,將Ball類的屬性定義為對象屬性,在創(chuàng)建對象時可以為對象屬性賦值。另外,在對象釋放時,輸出釋放信息。最終實現(xiàn)兩個顏色和大小都不同的球在畫布中運動。
1.構造方法前面在類中定義的屬性是類屬性,可以通過對象或類進行訪問;在構造方法中定義的屬性是實例屬性,只能通過對象進行訪問。構造方法的作用是初始化對象的屬性,即在創(chuàng)建對象時就完成屬性的賦值。二、相關知識每個類都有一個默認的__init__()方法。如果定義類時顯式地定義__init__()方法,那么創(chuàng)建對象時Python解釋器會調用顯式定義的__init__()方法;如果定義類時沒有顯式定義__init__()方法,那么Python解釋器會調用默認的__init__()方法。二、相關知識__init__()方法按照參數(shù)的有無(self除外)可分為有參構造方法和無參構造方法。無參構造方法無參構造方法中可以為屬性設置初始值,此時使用該方法創(chuàng)建的所有對象都具有相同的初始值。有參構造方法有參構造方法中可以使用參數(shù)為屬性設置初始值,此時使用該方法創(chuàng)建的所有對象都具有不同的初始值。二、相關知識定義一個類Rectangle,在該類中顯式地定義一個帶有2個參數(shù)的__init__()方法。classRectangle:def__init__(self):self.a=4self.b=6defget_area(self):returnself.a*self.brec1=Rectangle()print(rec1.get_area())rect2=Rectangle()rect2.a=6rect2.b=10print(rect2.get_area())二、相關知識classRectangle:def__init__(self,a,b):self.a=aself.b=bdefget_area(self):returnself.a*self.brec1=Rectangle(5,6)print(rec1.get_area())rect2=Rectangle(8,9)print(rect2.get_area())在介紹析構方法之前,先來了解Python的垃圾回收機制。Python中的垃圾回收主要采用的是引用計數(shù)。引用計數(shù)是一種內(nèi)存管理技術,它通過引用計數(shù)器記錄所有對象的引用數(shù)量,當對象的引用計數(shù)器數(shù)值為0時,就會將該對象視為垃圾進行回收。2.析構方法二、相關知識當一個對象的引用計數(shù)器數(shù)值為0時,就會調用__del__()方法,這個方法就是類的析構方法。classRectangle:def__init__(self,a,b):self.a=aself.b=bdefget_area(self):returnself.a*self.bdef__del__(self):print('邊長為',self.a,self.b,'的對象被釋放')rec1=Rectangle(5,6)print(rect1.get_area())rect2=Rectangle(8,9)print(rect2.get_area())二、相關知識如果需要手動釋放,可以使用del關鍵字刪除一個對象,釋放它所占用的資源。classRectangle:def__init__(self,a,b):self.a=aself.b=bdefget_area(self):returnself.a*self.bdef__del__(self):print('邊長為',self.a,self.b,'的對象被釋放')rec1=Rectangle(5,6)print(rec1.get_area())delrec1print("rect1被釋放")rect2=Rectangle(8,9)print(rect2.get_area())二、相關知識三、任務分析
類屬性是直接定義在類中的,而實例屬性(或對象屬性)是定義在__init__()方法中的。按照任務要求,需要在Ball類中增加__init__()方法,在釋放對象時輸出釋放信息;需要增加__del__()析構方法;實現(xiàn)兩個球運動,需要在程序中創(chuàng)建兩個對象。四、任務實現(xiàn)(1)在PyCharm的左側項目列表中,右擊文件“6-1純畫筆彈球.py”,在彈出的快捷菜單中選擇“Copy”,復制該Python文件。(2)在PyCharm的左側項目列表中,右擊項目名稱“chapter06”,在彈出的快捷菜單中選擇“Paste”,在項目中粘貼Python文件,并取名為“6-3純畫筆動畫彈球.py”,單擊“OK”按鈕,完成文件的復制。(3)修改“6-3純畫筆動畫彈球.py”文件中的代碼,在Ball類中增加__init__()方法,將原來的類屬性移動到__init__()方法中,并對代碼進行調整。其中,屬性diameter和color可以在創(chuàng)建對象時賦值,單位移動速度dx和dy取隨機數(shù),x坐標和y坐標設置為海龜所在的位置坐標。類的move()方法、bounce_on_edge()方法的代碼保持不變。四、任務實現(xiàn)(4)在類Ball的定義中增加析構方法__del__(),提示對象被釋放。(5)創(chuàng)建兩個不同大小、不同顏色的對象ball1和ball2。在創(chuàng)建對象時,通過傳遞參數(shù)值給對象的diameter和color屬性賦值。(6)修改循環(huán)語句,實現(xiàn)兩個球的運動。def__del__(self):print('直徑為'+str(self.diameter)+",顏色為"+self.color+"的小球被釋放!")ball1=Ball(50,'green')ball2=Ball(80,'purple')whileTrue:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025技術合同計算機軟件許可證協(xié)議書
- 2025正規(guī)個人向個人借款合同范本「標準版」
- 感恩節(jié)活動策劃方案(3篇)
- 2025授權委托合同協(xié)議書大全
- 熱載體加熱爐安全操作規(guī)程模版(3篇)
- 2025年物流公司工作計劃(三篇)
- 2025抽油機的可行性研究報告與擔保業(yè)合同監(jiān)管調研報告匯編
- 2025年辦公室工作計劃書(2篇)
- 2025信托資金借款合同書范本
- 幼兒園慶祝國慶節(jié)主題活動方案例文(三篇)
- 2025年考研政治全套復習題庫及答案(全冊完整版)
- 3《歡歡喜喜慶國慶》說課稿-2024-2025學年道德與法治二年級上冊統(tǒng)編版
- 蓄勢聚能籌遠略揚帆破浪啟新航-在2025年務虛會上的講話提綱
- 先進集體發(fā)言稿
- 學生寒假心理健康教育心理調試過健康寒假課件
- 八年級地理(下冊星球版)復習提綱
- 新建3000只肉羊養(yǎng)殖基地建設項目可行性研究報告
- 山東省濟南市2023-2024學年高二上學期期末考試生物試題 附答案
- DB32T 3292-2017 大跨徑橋梁鋼橋面環(huán)氧瀝青混凝土鋪裝養(yǎng)護技術規(guī)程
- GB/T 44819-2024煤層自然發(fā)火標志氣體及臨界值確定方法
- 《MATLAB編程及應用》全套教學課件
評論
0/150
提交評論