




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
類(lèi)與對(duì)象第十章課程目標(biāo)課程目標(biāo)1領(lǐng)會(huì)如何通過(guò)定義新類(lèi)為復(fù)雜程序提供結(jié)構(gòu)3524能夠閱讀并編寫(xiě)Python類(lèi)定義理解封裝的概念并知道它如何幫助構(gòu)建模塊化的、可維護(hù)的程序能夠編寫(xiě)包含簡(jiǎn)單類(lèi)定義的程序能夠編寫(xiě)包含創(chuàng)新(程序員設(shè)計(jì)的)控件的交互式圖形程序PART1對(duì)象的快速?gòu)?fù)習(xí)1對(duì)象的快速?gòu)?fù)習(xí)程序“計(jì)算”結(jié)構(gòu)化程序“數(shù)據(jù)”結(jié)構(gòu)化1對(duì)象的快速?gòu)?fù)習(xí)對(duì)象是管理復(fù)雜數(shù)據(jù)的重要工具對(duì)象一組相關(guān)信息一組信息的操作存儲(chǔ)信息的變量
稱(chēng)為屬性“存在”于對(duì)象內(nèi)的函數(shù)
稱(chēng)為方法這些操作又稱(chēng)為方法實(shí)例變量中一組相關(guān)信息被稱(chēng)為對(duì)象的“屬性”1對(duì)象的快速?gòu)?fù)習(xí)例子一個(gè)Circle對(duì)象
屬性:center:記住圓的中心點(diǎn)radius:保存圓的半徑
方法:draw方法:檢查center和radius,以確定窗口中的哪些像素應(yīng)該著色著Move方法:改變中心的值,以反映圓的新位置1對(duì)象的快速?gòu)?fù)習(xí)記住每個(gè)對(duì)象都是一個(gè)類(lèi)的一個(gè)實(shí)例,對(duì)象的類(lèi)決定對(duì)象將具有什么屬性。一個(gè)類(lèi)描述它的實(shí)例知道什么和做什么創(chuàng)建新對(duì)象調(diào)用構(gòu)造方法可視為創(chuàng)建新實(shí)例的工廠(chǎng)交通工具
是一個(gè)類(lèi)某一輛汽車(chē)、某一架飛機(jī)、某一輛自行車(chē)等
是這個(gè)交通工具類(lèi)的實(shí)例對(duì)象1對(duì)象的快速?gòu)?fù)習(xí)創(chuàng)建一個(gè)新的Circle對(duì)象:myCircle=Circle(Point(0,0),20)Circle是類(lèi)的名稱(chēng),用于調(diào)用構(gòu)造方法實(shí)例被創(chuàng)建后,可通過(guò)調(diào)用它的方法來(lái)操作它:myCircle.draw(win)myCircle.move(dx,dy)
創(chuàng)建了一個(gè)新的Circle實(shí)例,并將引用保存到變量myCircle構(gòu)造方法的參數(shù)用于初始化myCircle內(nèi)部的一些實(shí)例變量(即center和radius)PART2示例程序:炮彈2示例程序:炮彈程序規(guī)格說(shuō)明解決的問(wèn)題:輸入各種發(fā)射角度和初始速度,計(jì)算炮彈飛多遠(yuǎn)模擬炮彈程序輸入?yún)?shù)輸出結(jié)果炮彈的發(fā)射角(以度為單位)初始速度(以米每秒為單位)初始高度(以米為單位)拋體在撞擊地面前飛行的距離(以米為單位)2示例程序:炮彈程序規(guī)格說(shuō)明重力加速度:g≈9.8m/s2用模擬來(lái)跟蹤炮彈每個(gè)時(shí)刻的位置計(jì)算原理:物體在給定時(shí)間內(nèi)飛行的距離等于其速率乘以時(shí)間(d=rt)2示例程序:炮彈程序設(shè)計(jì)炮彈的兩個(gè)維度:高度:知道炮彈什么時(shí)候碰到地面一距離:記錄炮彈飛多遠(yuǎn)二2示例程序:炮彈程序設(shè)計(jì)炮彈的位置可視為二維圖中的點(diǎn)(x,y)xyx值:炮彈與起點(diǎn)的水平距離y值:炮彈與地面的高度,即垂直距離2示例程序:炮彈程序設(shè)計(jì)xy(0,0)炮彈飛行過(guò)程中,它在二維圖中點(diǎn)的坐標(biāo)是時(shí)刻更新的
每隔十分之一秒定時(shí)檢查炮彈的位置每個(gè)維度的精確距離由炮彈在該方向上的速度決定2示例程序:炮彈程序設(shè)計(jì)分離速度的x和y分量可以讓問(wèn)題變得更容易x速度y速度由于忽略風(fēng)的阻力,x速度在整個(gè)飛行中保持不變由于重力的影響,y速度隨時(shí)間而變化速度開(kāi)始為正,后隨著炮彈開(kāi)始下降變?yōu)樨?fù)值2示例程序:炮彈程序設(shè)計(jì)根據(jù)分析,模擬程序要做的事情如下:輸入模擬參數(shù):角度、速度、高度、間隔計(jì)算炮彈的初始位置:xpos、ypos計(jì)算炮彈的初始速度:xvel、yvelwhile炮彈仍在飛行時(shí):將xpos,ypos和yvel的值更新為飛行輸出中距離作為xpos的距離2示例程序:炮彈算法的第一行很簡(jiǎn)單,只需要合適的輸入語(yǔ)句序列:程序設(shè)計(jì)defmain():
angle=float(input("Enterthelaunchangle(indegrees):"))
vel=float(input("Entertheinitialvelocity(inmeters/sec):"))
h0=float(input("Entertheinitialheight(inmeters):"))
time=float(input("Enterthetimeintervalbetweenpositioncalculations:"))給炮彈的初始位置賦值,它將從距離0和高度h0開(kāi)始:xpos=0.0ypos=h02示例程序:炮彈程序設(shè)計(jì)水平速度分量公式:垂直速度分量公式:要將角度轉(zhuǎn)換為弧度2示例程序:炮彈程序設(shè)計(jì)Python的math庫(kù)提供了一個(gè)方便的函數(shù),稱(chēng)為radians,用于將角度數(shù)值轉(zhuǎn)換為弧度數(shù)值。theta=math.radians(angle)
xvel=vel*cos(theta)
yvel=vel*sin(theta)
計(jì)算初始速度的代碼:2示例程序:炮彈程序設(shè)計(jì)程序的主循環(huán)代碼:whileypos>=0.0:
通過(guò)檢查ypos的值不斷更新炮彈的位置和速度,直到它到達(dá)地面使用>=作為關(guān)系,可使炮彈在地面上開(kāi)始(=0)飛行時(shí),讓循環(huán)不斷執(zhí)行ypos的值下降到0以下時(shí),循環(huán)退出,表明炮彈已經(jīng)到達(dá)地面2示例程序:炮彈程序設(shè)計(jì)模擬的關(guān)鍵:
每次進(jìn)入循環(huán)時(shí),更新炮彈的狀態(tài),讓它在飛行中移動(dòng)time秒
風(fēng)阻忽略,炮彈的水平速度保持不變,由xvel的值給出水平方向xpos=xpos+time*xvel更新水平位置的代碼:2示例程序:炮彈程序設(shè)計(jì)
由于重力加速度的影響,速度每秒減少9.8m/s垂直方向速度隨時(shí)間而降低yvel1=yvel–time*9.8間隔結(jié)束時(shí)的新速度計(jì)算:2示例程序:炮彈程序設(shè)計(jì)平均垂直速度重力加速度是恒定的平均速度等于開(kāi)始和結(jié)束速度的平均值(yvel+yvel1)/2.02示例程序:炮彈程序設(shè)計(jì)whileypos>=0.0: xpos=xpos+time*xvel yvel1=yvel-time*9.8 ypos=ypos+time*(yvel+yvel1)/2.0 yvel=yvel1下面是完成的循環(huán):平均速度乘以間隔時(shí)間,給出了高度的變化保持初始值,計(jì)算平均速度表示在間隔結(jié)束時(shí)炮彈的正確垂直速度2示例程序:炮彈程序設(shè)計(jì)完整的程序:#cball1.py#Simulationoftheflightofacannonball(orotherprojectile)#Thisversionisnotmodularized.frommathimportpi,sin,cosdefmain():angle=float(input("Enterthelaunchangle(indegrees):"))vel=float(input("Entertheinitialvelocity(inmeters/sec):"))
2示例程序:炮彈程序設(shè)計(jì)完整的程序(續(xù)上):h0=float(input("Entertheinitialheight(inmeters):"))time=float(input("Enterthetimeintervalbetweenpositioncalculations:"))radians=(angle*pi)/180.0xpos=0ypos=h0xvel=vel*cos(radians)yvel=vel*sin(radians)2示例程序:炮彈程序設(shè)計(jì)完整的程序(續(xù)上):whileypos>=0:xpos=xpos+time*xvelyvel1=yvel-9.8*timeypos=ypos+time*(yvel+yvel1)/2.0yvel=yvel1print("\nDistancetraveled:{0:0.1f}meters.".format(xpos)最后一步,輸出飛行距離2示例程序:炮彈程序模塊化defmain():angle,vel,h0,time=getInputs()xpos,ypos=0,h0xvel,yvel=getXYComponents(vel,angle)whileypos>=0:xpos,ypos,yvel=updateCannonBall(time,xpos,ypos,xvel,yvel)print("\nDistancetraveled:{0:0.1f}meters.".format(xpos)使用輔助函數(shù)的主算法版本:theta在getXYComponents內(nèi)部使用yvel1是updateCannonBall的局部變量2示例程序:炮彈程序模塊化Projectile類(lèi)能“理解”炮彈這類(lèi)物體的物理特性用單個(gè)變量來(lái)創(chuàng)建和更新合適的對(duì)象,表示主算法2示例程序:炮彈程序模塊化通過(guò)“基于對(duì)象”的方法編寫(xiě)主程序:defmain():
angle,vel,h0,time=getInputs()
cball=Projectile(angle,vel,h0)
whilecball.getY()>=0:
cball.update(time)
print("\nDistancetraveled:{0:0.1f}meters.".format(cball.getX()))創(chuàng)建了一個(gè)Projectile,名為cball更新?tīng)顟B(tài)以記錄時(shí)間PART3定義新類(lèi)3定義新類(lèi)示例:多面骰子MSDie類(lèi)有多少面當(dāng)前的值類(lèi)該如何設(shè)計(jì)3定義新類(lèi)示例:多面骰子創(chuàng)建一個(gè)新的MSDie指定它將擁有多少面提供三種方法1roll方法:將骰子設(shè)置為1~n之間的隨機(jī)值,包括1和n2setValue方法:將骰子設(shè)置為特定值(即作弊)3getValue方法:查看當(dāng)前的值3定義新類(lèi)示例:多面骰子調(diào)用MSDie的構(gòu)造方法創(chuàng)建一個(gè)骰子實(shí)例變量1:內(nèi)部記錄面數(shù)實(shí)例變量2:保存骰子的當(dāng)前值面數(shù)作為參數(shù)骰子初始值為1該該值可以通過(guò)roll和setValue方法更改,并通過(guò)getValue方法返回。3定義新類(lèi)示例:多面骰子類(lèi)其實(shí)就是方法的集合,方法就是函數(shù)。MSDie的定義:fromrandomimportrandrangeclassMSDie:def__init__(self,sides):#用__init__定義的方法為構(gòu)造方法
self.sides=sides#類(lèi)屬性=參數(shù)
即為屬性賦值self.value=1defroll(self):#自定義方法
self.value=randrange(1,self.sides+1)defgetValue(self):#自定義方法
returnself.value#返回屬性值defsetValue(self,value):#自定義方法
self.value=value#設(shè)置屬性值class<class-name>: <method-definitions>類(lèi)定義的形式包含該方法所在的對(duì)象的引用3定義新類(lèi)示例:多面骰子假設(shè):一個(gè)main函數(shù)執(zhí)行die1.setValue(8)Step1調(diào)用程序(main)暫停在方法調(diào)用處。Step2該方法的形參被賦予調(diào)用的實(shí)參提供的值。self=die1value=8在執(zhí)行方法體之前,示例中執(zhí)行的語(yǔ)句完成了以下賦值:方法調(diào)用時(shí),第一個(gè)形參對(duì)應(yīng)于該對(duì)象defsetValue(self,value):#自定義方法
self.value=value#設(shè)置屬性值3定義新類(lèi)示例:多面骰子假設(shè):一個(gè)main函數(shù)執(zhí)行die1.setValue(8)Step3執(zhí)行方法體。Step4控制返回到調(diào)用方法之后的位置。在這個(gè)例子中,是緊隨die1.setValue(8)之后的語(yǔ)句。3定義新類(lèi)示例:多面骰子假設(shè):一個(gè)main函數(shù)執(zhí)行die1.setValue(8)圖調(diào)用中的控制流:die1.setValue(8)3定義新類(lèi)示例:多面骰子self即代表對(duì)象的參數(shù)。方法(參數(shù)1,參數(shù)2,...)self參數(shù)普通參數(shù)點(diǎn)表示法:<object>.<instance-var>Self參數(shù)可通過(guò)名稱(chēng)訪(fǎng)問(wèn)self.value是指與對(duì)象關(guān)聯(lián)的實(shí)例變量值每個(gè)實(shí)例都有自己的實(shí)例變量3定義新類(lèi)示例:多面骰子例子:特殊方法__init__類(lèi)某些方法對(duì)Python具有特殊的意義特征:方法的名稱(chēng)以?xún)蓷l下劃線(xiàn)開(kāi)始和結(jié)尾調(diào)用該方法能夠?yàn)閷?duì)象的實(shí)例變量提供初始值。構(gòu)造方法3定義新類(lèi)示例:多面骰子初始化新的MSDie的語(yǔ)句:die1=MSDie(6)該語(yǔ)句創(chuàng)建了一個(gè)新的MSDie,并在該對(duì)象上執(zhí)行inittdie1.sides的初始值:6die1.value的初始值:13定義新類(lèi)示例:多面骰子記住特定對(duì)象的狀態(tài)并作為對(duì)象的一部分傳遞給程序?qū)嵗兞恐悼稍谄渌椒ㄖ幸靡嗫稍谶B續(xù)調(diào)用相同方法時(shí)再次引用函數(shù)終止則值消失3定義新類(lèi)示例:多面骰子一個(gè)簡(jiǎn)單的例子:>>>die1=Die(13)>>>print(die1.getValue())1>>>die1.setValue(8)>>>print(die1.getValue())8在下一行打印出值3定義新類(lèi)示例:Projectile類(lèi)拋物體類(lèi)
初始化實(shí)例變量構(gòu)造方法
改變拋體的狀態(tài)update方法
得知當(dāng)前的位置getX方法
得知當(dāng)前的位置getY方法
3定義新類(lèi)示例:Projectile類(lèi)構(gòu)造方法角度速度高度創(chuàng)建一個(gè)炮彈:cball=Projectile(angle,vel,h0)3定義新類(lèi)示例:Projectile類(lèi)__init__方法用這些值來(lái)初始化cball的實(shí)例變量實(shí)例變量xposyposxvelyvel3定義新類(lèi)示例:Projectile類(lèi)下面是帶有構(gòu)造方法的類(lèi):classProjectile:def__init__(self,angle,velocity,height):self.xpos=0.0self.ypos=heighttheta=math.radians(angle)self.xvel=velocity*math.cos(theta)self.yvel=velocity*math.sin(theta)注意如何使用self點(diǎn)表示法,在對(duì)象內(nèi)創(chuàng)建四個(gè)實(shí)例變量。3定義新類(lèi)示例:Projectile類(lèi)defgetX(self):returnself.xposdefgetY(self):returnself.ypos設(shè)置獲取拋體位置的方法:只需設(shè)置一些返回位置值的方法3定義新類(lèi)示例:Projectile類(lèi)update方法代碼如下所示:defupdate(self,time):self.xpos=self.xpos+time*self.xvelyvel1=self.yvel-time*9.8self.ypos=self.ypos+time*(self.yvel+yvel1)/2.0self.yvel=yvel1接受一個(gè)普通參數(shù),表示時(shí)間間隔使用yvel1作為臨時(shí)變量將該值存儲(chǔ)到對(duì)象中,從而保存該新值3定義新類(lèi)示例:Projectile類(lèi)完整的炮彈問(wèn)題解決方案:frommathimportsin,cos,radiansclassProjectile:def__init__(self,angle,velocity,height):self.xpos=0.0self.ypos=heighttheta=radians(angle)self.xvel=velocity*cos(theta)self.yvel=velocity*sin(theta)3定義新類(lèi)示例:Projectile類(lèi)完整的炮彈問(wèn)題解決方案(續(xù)上):defupdate(self,time):self.xpos=self.xpos+time*self.xvelyvel1=self.yvel-9.8*timeself.ypos=self.ypos+time*(self.yvel+yvel1)/2.0self.yvel=yvel1defgetY(self):returnself.yposdefgetX(self):returnself.xpos3定義新類(lèi)示例:Projectile類(lèi)完整的炮彈問(wèn)題解決方案(續(xù)上):defgetInputs():a=float(input("輸入發(fā)射角度(度):"))v=float(input("輸入初速度(米/秒):"))h=float(input("輸入初始高度(米):"))t=float(input("輸入時(shí)間間隔:"))returna,v,h,t3定義新類(lèi)示例:Projectile類(lèi)完整的炮彈問(wèn)題解決方案(續(xù)上):defmain():angle,vel,h0,time=getInputs()cball=Projectile(angle,vel,h0)whilecball.getY()>=0:cball.update(time)print("\n飛行距離:{0:0.1f}meters.".format(cball.getX()))PART4用類(lèi)處理數(shù)據(jù)4用類(lèi)處理數(shù)據(jù)
在典型的大學(xué)里,課程是按學(xué)分來(lái)衡量的,而平均分是以4分為基準(zhǔn)計(jì)算。其中“A”是4分,“B”是3分...如此類(lèi)推。平均積分點(diǎn)(GPA)計(jì)算采用積分點(diǎn)計(jì)算平均積分點(diǎn)例如:課程價(jià)值3個(gè)學(xué)分,學(xué)生獲得“A”,那將獲得3(4)=12個(gè)積分平均積分點(diǎn)=總積分點(diǎn)除以完成的學(xué)分?jǐn)?shù)4用類(lèi)處理數(shù)據(jù)姓名學(xué)分積分Adams,Henry127228Comptewell,Susan100400DibbleBit,Denny1841.5Jones,Jim48.5155Smith,Frank37125.33學(xué)生成績(jī)信息4用類(lèi)處理數(shù)據(jù)任務(wù)描述:讀取文件,找到GPA最好的學(xué)生并打印他的名字、學(xué)分和GPA創(chuàng)建一個(gè)Student類(lèi)并在構(gòu)造方法中初始化:classStudent:def__init__(self,name,hours,qpoints):=nameself.hours=float(hours)self.qpoints=float(qpoints)對(duì)象是單個(gè)學(xué)生的信息記錄與實(shí)例變量名匹配的參數(shù)名稱(chēng)讓構(gòu)造方法變得更通用4用類(lèi)處理數(shù)據(jù)為HenryAdams創(chuàng)造一個(gè)記錄:aStudent=Student("Adams,Henry",127,228)定義一些取值的方法:defgetName(self):returndefgetHours(self):returnself.hoursdefgetQPoints(self):returnself.qpoints我們能夠使用這些方法從學(xué)生記錄中獲取信息!4用類(lèi)處理數(shù)據(jù)要打印學(xué)生姓名:print(aStudent.getName())計(jì)算GPA的方法:defgpa(self):returnself.qpoints/self.hoursGPA=總積分點(diǎn)/完成的學(xué)分?jǐn)?shù)4用類(lèi)處理數(shù)據(jù)
逐一查看文件中的學(xué)生并記錄到目前為止看到的最好的學(xué)生。算法原理類(lèi)似于確定n個(gè)數(shù)字的最大值的算法
從用戶(hù)處獲取文件名打開(kāi)文件并讀取信息先指定第一個(gè)學(xué)生為最好的學(xué)對(duì)于文件中的每個(gè)學(xué)生ifs.gpa()>best.gpa()指定s為最好的學(xué)生打印出最好學(xué)生的信息程序算法描述4用類(lèi)處理數(shù)據(jù)完整代碼:classStudent:def__init__(self,name,hours,qpoints):=nameself.hours=float(hours)self.qpoints=float(qpoints)defgetName(self):returndefgetHours(self):returnself.hoursdefgetQPoints(self):returnself.qpointsdefgpa(self):returnself.qpoints/self.hours4用類(lèi)處理數(shù)據(jù)完整代碼(續(xù)上):defmakeStudent(infoStr):#infoStr是一個(gè)用制表符分隔的行:namehoursqpoints#返回一個(gè)對(duì)應(yīng)的Student對(duì)象name,hours,qpoints=infoStr.split("\t")returnStudent(name,hours,qpoints)defmain():#打開(kāi)文件并讀取信息filename=input("輸入文件名稱(chēng):")infile=open(filename,’r’)
#將文件中的第一個(gè)學(xué)生設(shè)定為最好的學(xué)生best=makeStudent(infile.readline())添加輔助函數(shù)makeStudent按制表符拆分字段為文件中的第一個(gè)學(xué)生創(chuàng)建一個(gè)記錄4用類(lèi)處理數(shù)據(jù)完整代碼(續(xù)上):#處理文件的后續(xù)行forlineininfile:s=makeStudent(line)#如果s的最好學(xué)生,則用s替換ifs.gpa()>best.gpa():best=sinfile.close()
#打印最好學(xué)生的信息print("最好的學(xué)生是:",best.getName())print("hours:",best.getHours())print("GPA:",best.gpa())
if__name__==’__main__’:main()再次被調(diào)用來(lái)處理文件的后續(xù)每行4用類(lèi)處理數(shù)據(jù)對(duì)樣本數(shù)據(jù)的運(yùn)行結(jié)果:輸入文件名稱(chēng):students.dat最好的學(xué)生是:Computewell,Susanhours:100.0GPA:4.0這問(wèn)題如何解決呢?
問(wèn)題:
若有多名學(xué)生都有最佳的GPA,那么只報(bào)告第一名學(xué)生。PART5對(duì)象和封裝第三課時(shí)5對(duì)象和封裝封裝有用的抽象Projectile類(lèi)Student類(lèi)類(lèi)是讓程序變得模塊化的一種方法。
主程序只需要關(guān)心對(duì)象可以執(zhí)行的操作。這種分離的模式稱(chēng)為“封裝”5對(duì)象和封裝封裝有用的抽象你可以使用常規(guī)點(diǎn)符號(hào)訪(fǎng)問(wèn)任何對(duì)象的實(shí)例變量。測(cè)試Projectile類(lèi)的構(gòu)造方法:>>>c=Projectile(60,50,20)>>>c.xpos0.0>>>c.ypos20>>>c.xvel25.0>>>c.yvel43.301270通過(guò)創(chuàng)建對(duì)象直接檢查實(shí)例變量的值。5對(duì)象和封裝封裝有用的抽象允許獨(dú)立地修改和改進(jìn)類(lèi)不用擔(dān)心“破壞”程序的其他部分封裝的優(yōu)點(diǎn)5對(duì)象和封裝將類(lèi)放在模塊中程序A程序BProjectile類(lèi)這個(gè)類(lèi)的方法為什么要這么寫(xiě)?添加文檔描述5對(duì)象和封裝模塊文檔Python包含一種特殊的注釋約定,稱(chēng)為“文檔字符串”(docstring)。模塊類(lèi)函數(shù)在模塊、類(lèi)或函數(shù)的第一行插入一個(gè)簡(jiǎn)單的字符串字面量,為該組件提供文檔。5對(duì)象和封裝模塊文檔簡(jiǎn)單地忽略了常規(guī)注釋?zhuān)臋n字符串實(shí)際在執(zhí)行時(shí)被放在一個(gè)名為_(kāi)
_doc_
_的特殊屬性中,并且這些字符串可以動(dòng)態(tài)地檢查。文檔字符串的優(yōu)點(diǎn)5對(duì)象和封裝模塊文檔不記得如何使用隨機(jī)函數(shù)時(shí),可以直接打印其文檔字符串:>>>importrandom
>>>printrandom.random.__doc__
random()->xintheinterval[0,1).大多數(shù)Python庫(kù)模塊有大量的文檔字符串,可用于獲取有關(guān)使用模塊或其內(nèi)容的幫助。5對(duì)象和封裝模塊文檔你可以用交互式幫助獲得同樣的信息:>>>importrandom>>>help(random.randrange)Helponmethodrandrangeinmodulerandom:randrange(start,stop=None,step=1,_int=<class'int'>)methodofrandom.RandominstanceChoosearandomitemfromrange(start,stop[,step]).Thisfixestheproblemwithrandint()whichincludestheendpoint;inPythonthisisusuallynotwhatyouwant.我有個(gè)叫pydoc的程序可以自動(dòng)構(gòu)建模塊文檔。5對(duì)象和封裝模塊文檔下面是Projectile類(lèi)的一個(gè)版本:"""projectile.pyProvidesasimpleclassformodelingtheflightofprojectiles."""frommathimportsin,cos,radiansclassProjectile:"""Simulatestheflightofsimpleprojectilesneartheearth’ssurface,ignoringwindresistance.Trackingisdoneintwodimensions,height(y)anddistance(x)."""這是是一個(gè)包含文檔字符串的模塊文件5對(duì)象和封裝模塊文檔下面是Projectile類(lèi)的一個(gè)版本(續(xù)上):def__init__(self,angle,velocity,height):"""Createaprojectilewithgivenlaunchangle,initialvelocityandheight."""self.xpos=0.0self.ypos=heighttheta=radians(angle)self.xvel=velocity*cos(theta)self.yvel=velocity*sin(theta)5對(duì)象和封裝模塊文檔下面是Projectile類(lèi)的一個(gè)版本(續(xù)上):defupdate(self,time):"""Updatethestateofthisprojectiletomoveittimesecondsfartherintoitsflight"""self.xpos=self.xpos+time*self.xvelyvel1=self.yvel-9.8*timeself.ypos=self.ypos+time*(self.yvel+yvel1)/2.0self.yvel=yvel15對(duì)象和封裝模塊文檔下面是Projectile類(lèi)的一個(gè)版本(續(xù)上):defgetY(self):"Returnstheyposition(height)ofthisprojectile."returnself.yposdefgetX(self):"Returnsthexposition(distance)ofthisprojectile."returnself.xpos5對(duì)象和封裝模塊文檔下面是在打印時(shí)顯示文檔字符串的示例:>>>print(projectile.Projectile.__doc__)Simulatestheflightofsimpleprojectilesneartheearth’ssurface,ignoringwindresistance.Trackingisdoneintwodimensions,height(y)anddistance(x).可以使用help查看模塊的完整文檔哦!5對(duì)象和封裝使用多個(gè)模塊我們的主程序現(xiàn)在可以簡(jiǎn)單地從projectile模塊導(dǎo)入:fromprojectileimportProjectiledefgetInputs():a=float(input("輸入發(fā)射角度(度):"))v=float(input("輸入初速度(米/秒):"))h=float(input("輸入初始高度(米):"))t=float(input("輸入時(shí)間間隔:"))returna,v,h,tdefmain():angle,vel,h0,time=getInputs()cball=Projectile(angle,vel,h0)whilecball.getY()>=0:cball.update(time)print("\n飛行距離:{0:0.1f}米.".format(cball.getX()))原來(lái)的問(wèn)題可以解決了!5對(duì)象和封裝使用多個(gè)模塊首次導(dǎo)入模板創(chuàng)建命名空間創(chuàng)建對(duì)已有模塊對(duì)象的更多引用,續(xù)導(dǎo)入不會(huì)重新加載該模塊。導(dǎo)入成功模塊被更改后,即使重新導(dǎo)入也不會(huì)得到更新的版本。測(cè)試中涉及的任何模塊被修改時(shí),應(yīng)重新開(kāi)始交互式會(huì)話(huà),以保證對(duì)模塊進(jìn)行全新(更新)導(dǎo)入。PART6控件6控件示例程序:擲骰子程序
我們將通過(guò)Button類(lèi)實(shí)現(xiàn)兩個(gè)按鈕,用DieView類(lèi)提供骰子數(shù)字的圖形視圖。我們一起來(lái)構(gòu)建一些有用的控件吧!圖擲骰子程序的用戶(hù)界面6控件創(chuàng)建按鈕擲骰子程序的按鈕應(yīng)具備以下的方法:方法名描述構(gòu)造方法創(chuàng)建一個(gè)按鈕,并能夠指定按鈕顯示的窗口、按鈕的位置或大小,以及按鈕上的標(biāo)簽。Activate將按鈕的狀態(tài)設(shè)置為啟用。Deactivate將按鈕的狀態(tài)設(shè)置為禁用。Clicked表明按鈕是否被點(diǎn)擊。若按鈕處于啟用狀態(tài),此方法將確定點(diǎn)擊的點(diǎn)是否在按鈕區(qū)域內(nèi)。該點(diǎn)必須作為參數(shù)發(fā)送給該方法。getLabel用于返回按鈕的標(biāo)簽字符串并識(shí)別特定的按鈕。6控件創(chuàng)建按鈕Activate方法通過(guò)讓輪廓變得更粗或讓標(biāo)簽文本使用黑體來(lái)表示按鈕是啟用:defactivate(self):"將按鈕設(shè)置為激活."self.label.setFill('black')self.rect.setWidth(2)self.active=True注意,self參數(shù)指向按鈕對(duì)象。6控件創(chuàng)建按鈕Clicked方法按鈕處理的代碼如下所示:pt=win.getMouse()ifbutton1.clicked(pt):#處理button1的事件elifbutton2.clicked(pt):#處理button2的事件elifbutton3.clicked(pt)#處理button3的事件...graphics包提供了一個(gè)getMouse方法,可返回鼠標(biāo)點(diǎn)擊的點(diǎn)。調(diào)用getMouse可檢查點(diǎn)在哪個(gè)啟用的按鈕中6控件創(chuàng)建按鈕需要的變量應(yīng)包括按鈕對(duì)象的縱橫坐標(biāo)值的最大值和最小值。Clicked方法主要工作:確定給定點(diǎn)是否在矩形按鈕內(nèi)。判斷條件:若點(diǎn)的x和y坐標(biāo)位于矩形的極值x和y值之間,則該點(diǎn)在矩形內(nèi)。6控件創(chuàng)建按鈕用單個(gè)布爾表達(dá)式來(lái)實(shí)現(xiàn)clicked方法:假設(shè):存在實(shí)例變量xmin、xmax、ymin和ymaxdefclicked(self,p):"若按鈕處于激活,且p在按鈕矩形內(nèi),則返回true"return(self.activeandself.xmin<=p.getX()<=self.xmaxandself.ymin<=p.getY()<=self.ymax)當(dāng)三個(gè)表達(dá)式都為真時(shí),clicked才會(huì)返回真。6控件創(chuàng)建按鈕完整的類(lèi),并帶有合適的構(gòu)造方法:fromgraphicsimport*classButton:"""按鈕是窗口中標(biāo)記的矩形。使用activate()和deactivate()方法激活或禁用它。如果按鈕是激活的并且p在按鈕內(nèi),那么clicked(p)方法將返回true."""def__init__(self,win,center,width,height,label):"""創(chuàng)建一個(gè)矩形框按鈕qb=Button(myWin,centerPoint,width,height,’Quit’)"""w,h=width/2.0,height/2.0x,y=center.getX(),center.getY()
6控件創(chuàng)建按鈕完整的類(lèi),并帶有合適的構(gòu)造方法(續(xù)上):self.xmax,self.xmin=x+w,x-wself.ymax,self.ymin=y+h,y-hp1=Point(self.xmin,self.ymin)p2=Point(self.xmax,self.ymax)self.rect=Rectangle(p1,p2)self.rect.setFill(’lightgray’)self.rect.draw(win)self.label=Text(center,label)self.label.draw(win)self.deactivate()6控件創(chuàng)建按鈕完整的類(lèi),并帶有合適的構(gòu)造方法(續(xù)上):defclicked(self,p):"按鈕處于激活且p在矩形按鈕范圍時(shí)返回true"return(self.activeandself.xmin<=p.getX()<=self.xmaxandself.ymin<=p.getY()<=self.ymax)defgetLabel(self):"返回此按鈕的標(biāo)簽字符串."returnself.label.getText()6控件創(chuàng)建按鈕完整的類(lèi),并帶有合適的構(gòu)造方法(續(xù)上):defactivate(self):"設(shè)置按鈕為激活狀態(tài)."self.label.setFill(’black’)self.rect.setWidth(2)self.active=Truedefdeactivate(self):"設(shè)置按鈕為禁用狀態(tài)."self.label.setFill(’darkgrey’)self.rect.setWidth(1)self.active=False6控件構(gòu)建骰子類(lèi)骰子類(lèi)目的:以圖形的方式顯示骰子的值。點(diǎn)數(shù)是圓形骰子的一面是正方形(通過(guò)Rectangle)6控件構(gòu)建骰子類(lèi)DieView將具有以下接口:一構(gòu)造方法用于在窗口中創(chuàng)建一個(gè)骰子并以窗口、骰子的中心點(diǎn)和骰子的尺寸作為參數(shù)。二setValue方法用于更改視圖以顯示給定的值,并且要顯示的值將作為參數(shù)傳遞。6控件構(gòu)建骰子類(lèi)DieView的核心是調(diào)整不同點(diǎn)的“開(kāi)”和“關(guān)”,以表示骰子的當(dāng)前值。一個(gè)簡(jiǎn)單的方法在所有可能的位置預(yù)先放置圓圈通過(guò)改變顏色來(lái)點(diǎn)亮或關(guān)閉點(diǎn)6控件構(gòu)建骰子類(lèi)構(gòu)造方法:創(chuàng)建背景正方形和七個(gè)圓。setValue方法:根據(jù)骰子的值設(shè)置圓的顏色。6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼:fromgraphicsimport*classDieView:"""DieView是一個(gè)顯示標(biāo)準(zhǔn)六面骰子的的圖像表示的部件."""def__init__(self,win,center,size):"""創(chuàng)建一個(gè)die視圖:d1=DieView(myWin,Point(40,50),20)創(chuàng)建一個(gè)以(40,50)為中心,邊長(zhǎng)為20的die."""#首先定義一些標(biāo)準(zhǔn)值self.win=win#將此保存為稍后繪制點(diǎn)self.background="white"#die背景顏色self.foreground="black"#圓的顏色定義一組值確定骰子的各種屬性。6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼(續(xù)上):self.psize=0.1*size#各圓的半徑hsize=size/2.0#骰子的一半offset=0.6*hsize#中心點(diǎn)到外部點(diǎn)的距離#創(chuàng)建一個(gè)正方形輪廓cx,cy=center.getX(),center.getY()p1=Point(cx-hsize,cy-hsize)p2=Point(cx+hsize,cy+hsize)rect=Rectangle(p1,p2)rect.draw(win)rect.setFill(self.background)6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼(續(xù)上):#在標(biāo)準(zhǔn)位置創(chuàng)建7個(gè)圓self.pip1=self.__makePip(cx-offset,cy-offset)self.pip2=self.__makePip(cx-offset,cy)self.pip3=self.__makePip(cx-offset,cy+offset)self.pip4=self.__makePip(cx,cy)self.pip5=self.__makePip(cx+offset,cy-offset)self.pip6=self.__makePip(cx+offset,cy)self.pip7=self.__makePip(cx+offset,cy+offset)#畫(huà)一個(gè)初值self.setValue(1)這個(gè)方法只是一個(gè)輔助函數(shù),執(zhí)行繪制每個(gè)點(diǎn)時(shí)所需的四行代碼。以下劃線(xiàn)或雙下劃線(xiàn)開(kāi)頭的方法名稱(chēng),表示該方法對(duì)類(lèi)是“私有的”6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼(續(xù)上):def__makePip(self,x,y):"以(x,y)為圓心畫(huà)圓的輔助函數(shù)"pip=Circle(Point(x,y),self.psize)pip.setFill(self.background)pip.setOutline(self.background)pip.draw(self.win)returnpip
defsetValue(self,value):"將此die設(shè)置為顯示值."#turnallpipsoff6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼(續(xù)上):self.pip1.setFill(self.background)self.pip2.setFill(self.background)self.pip3.setFill(self.background)self.pip4.setFill(self.background)self.pip5.setFill(self.background)self.pip6.setFill(self.background)self.pip7.setFill(self.background)#正確打開(kāi)各圓的“開(kāi)關(guān)”ifvalue==1:self.pip4.setFill(self.foreground)6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼(續(xù)上):elifvalue==2:self.pip1.setFill(self.foreground)self.pip7.setFill(self.foreground)elifvalue==3:self.pip1.setFill(self.foreground)self.pip7.setFill(self.foreground)self.pip4.setFill(self.foreground)elifvalue==4:self.pip1.setFill(self.foreground)self.pip3.setFill(self.foreground)self.pip5.setFill(self.foreground)self.pip7.setFill(self.foreground)6控件構(gòu)建骰子類(lèi)下面是我們的DieView類(lèi)的代碼(續(xù)上):elifvalue==5:self.pip1.setFill(self.foreground)self.pip3.setFill(self.foreground)self.pip4.setFill(self.foreground)self.pip5.setFill(self.foreground)self.pip7.setFill(self.foreground)else:self.pip1.setFill(self.foreground)self.pip2.setFill(self.foreground)self.pip3.setFill(self.foreground)self.pip5.setFill(self.foreground)self.pip6.setFill(self.foreground)self.pip7.setFill(self.foreground)6控件主程序使用新控件的程序代碼:fromrandomimportrandrangefromgraphicsimportGraphWin,PointfrombuttonimportButtonfromdieviewimportDieViewdefmain():#創(chuàng)建應(yīng)用窗口win=GraphWin("搖骰子")win.setCoords(0,0,10,10)win.setBackground("green2")Button和Dieview類(lèi)是從各自的模塊導(dǎo)入的。6控件主程序使用新控件的程序代碼(續(xù)上):#繪制界面部件die1=DieView(win,Point(3,7),2)die2=DieView(win,Point(7,7),2)rollButton=Button(win,Point(5,4.5),6,1,"投擲骰子")rollButton.activate()quitButton=Button(win,Point(5,1),2,1,"退出")#事件循環(huán)pt=win.getMouse()“投擲骰子”按鈕最初處于激活狀態(tài)。6控件主程序使用新控件的程序代碼(續(xù)上):whilenotquitButton.clicked(pt):ifrollButton.clicked(pt):value1=randrange(1,7)die1.setValue(value1)value2=randrange(1,7)die2.setValue(value2)quitButton.activate()pt=win.getMouse()#停止win.close()main()程序的核心是事件循環(huán)。PART7動(dòng)畫(huà)炮彈第四課時(shí)7動(dòng)畫(huà)炮彈圖炮彈飛行的界面讓我們一起用新的對(duì)象思想為炮彈示例添加一個(gè)更好的界面吧!7動(dòng)畫(huà)炮彈繪制動(dòng)畫(huà)窗口第一步:創(chuàng)建一個(gè)圖形窗口,并在底部畫(huà)出合適的坐標(biāo)線(xiàn)。下面是程序開(kāi)始部分的代碼:defmain():#創(chuàng)建動(dòng)畫(huà)窗口win=GraphWin("發(fā)射動(dòng)畫(huà)",640,480,autoflush=False)win.setCoords(-10,-10,210,155)#繪制坐標(biāo)線(xiàn)Line(Point(-10,0),Point(210,0)).draw(win)#每個(gè)50米繪制刻度f(wàn)orxinrange(0,210,50): Text(Point(x,-5),str(x)).draw(win) Line(Point(x,0),Point(x,2)).draw(win)7動(dòng)畫(huà)炮彈繪制動(dòng)畫(huà)窗口默認(rèn)情況:每當(dāng)對(duì)象被要求更改時(shí),都會(huì)立即更新圖形對(duì)象的外觀(guān)。
mycircle.setFill("green")更改圓的顏色圖形命令A(yù)圖形命令B圖形命令C......通過(guò)將autoflush設(shè)置為false,可以讓圖形庫(kù)在實(shí)際執(zhí)行命令之前,允許一些命令在管道中準(zhǔn)備好。7動(dòng)畫(huà)炮彈繪制動(dòng)畫(huà)窗口為什么不讓圖形命令立即生效呢?關(guān)閉autoflush通常能讓圖形程序更有效率。
原因:
■圖形命令需要與底層的操作系統(tǒng)進(jìn)行通信,與顯示器硬件交換信息,比較耗時(shí)?!霾荒芏啻瓮V钩绦騺?lái)執(zhí)行一系列小圖形命令。7動(dòng)畫(huà)炮彈繪制動(dòng)畫(huà)窗口關(guān)閉autoflush能在更新發(fā)生時(shí)精確地控制程序。
原因:
■動(dòng)畫(huà)期間,屏幕上可能會(huì)出現(xiàn)許多需要同步的更新?!鲫P(guān)閉autoflush能進(jìn)行許多更改,然后通過(guò)調(diào)用update函數(shù)時(shí)同時(shí)顯示。這是做動(dòng)畫(huà)的常見(jiàn)方式!7動(dòng)畫(huà)炮彈繪制動(dòng)畫(huà)窗口炮彈飛行的界面程序設(shè)置下一幀的更改調(diào)用update()顯示該幀一次只有一個(gè)對(duì)象移動(dòng)動(dòng)畫(huà)時(shí)幾乎總是要關(guān)閉autoflush7動(dòng)畫(huà)炮彈創(chuàng)建ShotTrackerProjectile類(lèi)Circle類(lèi)具備炮彈行為不是圖形對(duì)象,無(wú)法繪制不具備炮彈行為是圖形對(duì)象,可以繪制
Circle-Projectile混合體
ShotTracker7動(dòng)畫(huà)炮彈創(chuàng)建ShotTracker
ShotTrackerProjectile類(lèi)Circle類(lèi)ShotTracker的工作:
確保這些實(shí)例變量保持彼此同步。7動(dòng)畫(huà)炮彈創(chuàng)建ShotTrackerdef__init__(self,win,angle,velocity,height):"""win是反應(yīng)炮彈發(fā)射角度、初速度和初始高度等信息的GrapWin窗口."""j=Projectile(angle,velocity,height)self.marker=Circle(Point(0,height),3)self.marker.setFill("red")self.marker.setOutline("red")self.marker.draw(win)
ShotTracker類(lèi)的構(gòu)造方法:7動(dòng)畫(huà)炮彈創(chuàng)建ShotTracker
ShotTrackerProjectile類(lèi)Circle類(lèi)目標(biāo):確保每次更新發(fā)生時(shí),Projectile和Circle的位置都會(huì)適當(dāng)?shù)匦薷?。update方法用適當(dāng)?shù)臅r(shí)間間隔調(diào)用它的update方法。通過(guò)計(jì)算它在x和y方向上移動(dòng)的距離,以確定更新的拋體所在圓的中心。7動(dòng)畫(huà)炮彈創(chuàng)建ShotTrackerdefupdate(self,dt):"""讓炮彈在飛行過(guò)程中在飛行dt秒"""#更新炮彈j.update(dt)
#將圓移動(dòng)到新的炮彈位置center=self.marker.getCenter()dx=j.getX()-center.getX()dy=j.getY()-center.getY()self.marker.move(dx,dy)調(diào)用update方法處理Projectile和Circle:7動(dòng)畫(huà)炮彈創(chuàng)建ShotTrackerdefgetX(self):"""返回當(dāng)前炮彈的圓心坐標(biāo)x""" returnj.getX()defgetY(self):"""返回當(dāng)前炮彈的圓心坐標(biāo)y""" returnj.getY()defundraw(self):"""擦除炮彈""" self.marker.undraw()添加取值方法和擦除炮彈的方法:7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框用戶(hù)角度速度初始高度獲取方法:■采用一些input語(yǔ)句■在GUI中通過(guò)使用對(duì)話(huà)框獲取用戶(hù)的輸入7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框圖炮彈動(dòng)畫(huà)的自定義輸入對(duì)話(huà)框一個(gè)對(duì)話(huà)框就是一種miniGUI。“Fire!”“Quit”啟動(dòng)炮彈退出程序7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框classInputDialog:"""用于從用戶(hù)獲取模擬值(角度、速度和高度)的自定義窗口."""def__init__(self,angle,vel,height):"""創(chuàng)建并顯示輸入窗口"""self.win=win=GraphWin("初始值",200,300)win.setCoords(0,4.5,4,.5)Text(Point(1,1),"角度").draw(win)self.angle=Entry(Point(3,1),5).draw(win)self.angle.setText(str(angle))Text(Point(1,2),"速度").draw(win)創(chuàng)建窗口并在構(gòu)造方法中繪制其內(nèi)容:7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框self.vel=Entry(Point(3,2),5).draw(win)
self.vel.setText(str(vel))Text(Point(1,3),"高度").draw(win)self.height=Entry(Point(3,3),5).draw(win)self.height.setText(str(height))self.fire=Button(win,Point(1,4),1.25,.5,"發(fā)射!")self.fire.activate()self.quit=Button(win,Point(3,4),1.25,.5,"停止")self.quit.activate()創(chuàng)建窗口并在構(gòu)造方法中繪制其內(nèi)容(續(xù)上):7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框definteract(self):"""等待用戶(hù)點(diǎn)擊“停止”和“射擊”按鈕返回一個(gè)顯示按鈕的字符串"""whileTrue:pt=self.win.getMouse()ifself.quit.clicked(pt):return"Quit"ifself.fire.clicked(pt):return"Fire"使用自己的事件循環(huán)實(shí)現(xiàn)模態(tài):等待鼠標(biāo)點(diǎn)擊,直到其中一個(gè)按鈕被按下為止。7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框defgetValues(self):"""返回輸入值"""a=float(self.angle.getText())v=float(self.vel.getText())h=float(self.height.getText())returna,v,h
defclose(self):"""關(guān)閉輸入窗口""" self.win.close()該方法的返回值用于指示哪個(gè)按鈕被點(diǎn)擊:添加一個(gè)操作來(lái)獲取數(shù)據(jù)注意,輸入的字符串將轉(zhuǎn)換為浮點(diǎn)值,主程序只是獲取數(shù)字注意,輸入的字符串將轉(zhuǎn)換為浮點(diǎn)值,主程序只是獲取數(shù)字。7動(dòng)畫(huà)炮彈創(chuàng)建輸入對(duì)話(huà)框dialog=InputDialog(45,40,2)choice=eract()ifchoice=="Fire!": angle,vel,height=dialog.getValues()從用戶(hù)獲取值:關(guān)閉對(duì)話(huà)框在每次輸入需要時(shí)彈出一個(gè)新的對(duì)話(huà)框保持單個(gè)對(duì)話(huà)框打開(kāi),并與它進(jìn)行多次交互7動(dòng)畫(huà)炮彈主事件循環(huán)defmain():#創(chuàng)建動(dòng)畫(huà)窗口win=GraphWin("炮彈動(dòng)畫(huà)",640,480,autoflush=False)win.setCoords(-10,-10,210,155)Line(Point(-10,0),Point(210,0)).draw(win)forxinrange(0,210,50):Text(Point(x,-5),str(x)).draw(win)Line(Point(x,0),Point(x,2)).draw(win)#事件循環(huán),每次發(fā)射一枚炮彈angle,vel,height=45.0,40.0,2.0whileTrue:#與用戶(hù)交互
主函數(shù)代碼:7動(dòng)畫(huà)炮彈主事件循環(huán)inputwin=InputDialog(angle,vel,height)choice=eract()inputwin.close()ifchoice=="Quit":break#創(chuàng)建追蹤,直到炮彈到達(dá)地方或離開(kāi)窗口angle,vel,height=inputwin.getValues()shot=ShotTracker(win,angle,vel,height)while0<=shot.getY()and-10<shot.getX()<=210:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)派遺合同范本
- 養(yǎng)殖社購(gòu)銷(xiāo)合同范本
- 借條正規(guī)合同范本
- 公司網(wǎng)絡(luò)線(xiàn)路維修合同范本
- 加工蔬菜采購(gòu)合同范本
- 利益聯(lián)結(jié)機(jī)制合同范本
- 出租專(zhuān)用桌子合同范本
- 與社區(qū)合作社簽訂合同范例
- 二手房按揭買(mǎi)賣(mài)合同范本
- 公司許可經(jīng)營(yíng)合同范本
- 中醫(yī)四季養(yǎng)生之道課件
- 消防安全教育主題班會(huì)課件
- 《2024版 CSCO胃癌診療指南》解讀
- 情感表達(dá) 課件 2024-2025學(xué)年人教版(2024)初中美術(shù)七年級(jí)上冊(cè)
- 公交駕駛員心理素質(zhì)培訓(xùn)考核試卷
- 2024年上半年教師資格證《初中道德與法治》真題及答案
- 區(qū)塊鏈應(yīng)用操作員技能大賽考試題庫(kù)大全-上(單選題)
- 2024屆中國(guó)航空發(fā)動(dòng)機(jī)集團(tuán)限公司校園招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- 人教版小學(xué)數(shù)學(xué)“數(shù)與代數(shù)”的梳理
- 2024年全國(guó)鄉(xiāng)村醫(yī)生考試復(fù)習(xí)題庫(kù)及答案(共360題)
- 漢語(yǔ)言文學(xué)論文8000字范文
評(píng)論
0/150
提交評(píng)論