版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο笤O(shè)計(jì)第十一章課程目標(biāo)課程目標(biāo)1理解面向?qū)ο笤O(shè)計(jì)的過(guò)程324能夠閱讀和理解面向?qū)ο蟮某绦蛄私夥庋b、多態(tài)和繼承的概念利用面向?qū)ο笤O(shè)計(jì)來(lái)設(shè)計(jì)中等復(fù)雜程度的軟件PART1面向?qū)ο笤O(shè)計(jì)的過(guò)程1面向?qū)ο笤O(shè)計(jì)的過(guò)程魔法黑盒組件A組件B面向?qū)ο笤O(shè)計(jì)
的本質(zhì)是從魔法黑盒及其接口的角度來(lái)描述系統(tǒng)。是自頂向下程序設(shè)計(jì)方法的有力補(bǔ)充,用于開發(fā)可靠的、性價(jià)比高的軟件系統(tǒng)
這章將介紹OOD的基本原理并通過(guò)案例加深理解。組件可能是服務(wù)的用戶或客戶1面向?qū)ο笤O(shè)計(jì)的過(guò)程面向?qū)ο笤O(shè)計(jì)的一些直觀指導(dǎo)1、尋找候選對(duì)象。2、識(shí)別屬性。3、考慮接口。4、細(xì)化不簡(jiǎn)單的方法。5、迭代式設(shè)計(jì)。6、嘗試替代方案。7、保持簡(jiǎn)單。1面向?qū)ο笤O(shè)計(jì)的過(guò)程以一個(gè)例子來(lái)說(shuō)明面向過(guò)程:一般情況為了表示一個(gè)學(xué)生的成績(jī),面向過(guò)程的程序可以用一個(gè)dict表示std1={'name':'Michael','score':98}std2={'name':'Bob','score':81}處理學(xué)生成績(jī)可以通過(guò)函數(shù)實(shí)現(xiàn)defprint_score(std):print('%s:%s'%(std['name'],std['score']))1面向?qū)ο笤O(shè)計(jì)的過(guò)程以一個(gè)例子來(lái)說(shuō)明面向過(guò)程:采用面向?qū)ο蟮某绦蛟O(shè)計(jì)思想,代碼則是這樣寫:classStudent(object):def__init__(self,name,score):=nameself.score=scoredefprint_score(self):print('%s:%s'%(,self.score))1面向?qū)ο笤O(shè)計(jì)的過(guò)程以一個(gè)例子來(lái)說(shuō)明面向過(guò)程:對(duì)象的方法(Method)用面向?qū)ο蟮某绦驅(qū)懗鰜?lái)就像這樣:bart=Student('BartSimpson',59)lisa=Student('LisaSimpson',87)bart.print_score()lisa.print_score()PART2類和實(shí)例2類和實(shí)例面向?qū)ο笞钪匾母拍罹褪穷悾–lass)和實(shí)例(Instance),必須牢記類是抽象的模板,比如Student類,而實(shí)例是根據(jù)類創(chuàng)建出來(lái)的一個(gè)個(gè)具體的“對(duì)象”,每個(gè)對(duì)象都擁有相同的方法,但各自的數(shù)據(jù)可能不同。在Python中,定義類是通過(guò)class關(guān)鍵字:classStudent(object):pass2類和實(shí)例定義好了Student類,就可以根據(jù)Student類創(chuàng)建出Student的實(shí)例,創(chuàng)建實(shí)例是通過(guò)類名+()實(shí)現(xiàn)的>>>bart=Student()>>>bart<__main__.Studentobjectat0x10a67a590>>>>Student<class'__main__.Student'>2類和實(shí)例可以自由地給一個(gè)實(shí)例變量綁定屬性,比如,給實(shí)例bart綁定一個(gè)name屬性:>>>='BartSimpson'>>>'BartSimpson'2類和實(shí)例由于類可以起到模板的作用,因此,可以在創(chuàng)建實(shí)例的時(shí)候,把一些認(rèn)為必須綁定的屬性強(qiáng)制填寫進(jìn)去。通過(guò)定義一個(gè)特殊的__init__方法,在創(chuàng)建實(shí)例的時(shí)候,就把name,score等屬性綁上去:注意:特殊構(gòu)造方法“__init__”前后分別有兩個(gè)下劃線?。?!classStudent(object):def__init__(self,name,score):=nameself.score=score2類和實(shí)例在這里例子中,有了__init__方法,在創(chuàng)建實(shí)例的時(shí)候,就不能傳入空的參數(shù)了,必須傳入與__init__方法匹配的參數(shù),但self不需要傳,Python解釋器自己會(huì)把實(shí)例變量傳進(jìn)去:>>>bart=Student('BartSimpson',59)>>>'BartSimpson'>>>bart.score59PART3數(shù)據(jù)封裝3數(shù)據(jù)封裝面向?qū)ο缶幊痰囊粋€(gè)重要特點(diǎn)就是數(shù)據(jù)封裝。在上面的Student類中,每個(gè)實(shí)例就擁有各自的name和score這些數(shù)據(jù)。我們可以通過(guò)函數(shù)來(lái)訪問(wèn)這些數(shù)據(jù),比如打印一個(gè)學(xué)生的成績(jī):>>>defprint_score(std):print('%s:%s'%(,std.score))>>>print_score(bart)BartSimpson:593數(shù)據(jù)封裝可以直接在Student類的內(nèi)部定義訪問(wèn)數(shù)據(jù)的函數(shù),就把“數(shù)據(jù)”給封裝起來(lái)了。這些封裝數(shù)據(jù)的函數(shù)和Student類本身是關(guān)聯(lián)起來(lái)的,我們稱之為類的方法:classStudent(object):def__init__(self,name,score):=nameself.score=scoredefprint_score(self):print('%s:%s'%(,self.score))3數(shù)據(jù)封裝要定義一個(gè)方法,除了第一個(gè)參數(shù)是self外,其他和普通函數(shù)一樣。要調(diào)用一個(gè)方法,只需要在實(shí)例變量上直接調(diào)用,除了self不用傳遞,其他參數(shù)正常傳入>>>bart.print_score()BartSimpson:593數(shù)據(jù)封裝封裝的另一個(gè)好處是可以給Student類增加新的方法,比如get_grade:classStudent(object):
defget_grade(self):ifself.score>=90:return'A'elifself.score>=60:return'B'else:return'C'3數(shù)據(jù)封裝和靜態(tài)語(yǔ)言不同,Python允許對(duì)實(shí)例變量綁定任何數(shù)據(jù),也就是說(shuō),對(duì)于兩個(gè)實(shí)例變量,雖然它們都是同一個(gè)類的不同實(shí)例,但擁有的變量名稱都可能不同>>>bart=Student('BartSimpson',59)>>>lisa=Student('LisaSimpson',87)>>>bart.age=8>>>bart.age8>>>lisa.ageTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>AttributeError:'Student'objecthasnoattribute'age'PART4訪問(wèn)限制4訪問(wèn)限制從前面Student類的定義來(lái)看,外部代碼還是可以自由地修改一個(gè)實(shí)例的name、score屬性>>>bart=Student('BartSimpson',59)>>>bart.score59>>>bart.score=99>>>bart.score994訪問(wèn)限制把Student類修改后:classStudent(object):def__init__(self,name,score):self.__name=nameself.__score=scoredefprint_score(self):print('%s:%s'%(self.__name,self.__score))4訪問(wèn)限制把Student類修改后,已經(jīng)無(wú)法從外部訪問(wèn)實(shí)例變量.__name和實(shí)例變量.__score>>>bart=Student('BartSimpson',59)>>>bart.__nameTraceback(mostrecentcalllast):File"<stdin>",line1,in<module>AttributeError:'Student'objecthasnoattribute'__name'4訪問(wèn)限制如果外部代碼要獲取name和score,可以給Student類增加get_name和get_score兩個(gè)方法classStudent(object):
defget_name(self):returnself.__namedefget_score(self):returnself.__score4訪問(wèn)限制雙下劃線開頭的實(shí)例變量是不是一定不能從外部訪問(wèn)呢?其實(shí)也不是,不能直接訪問(wèn)__name的原因是因?yàn)镻ython解釋器對(duì)外把__name變量改成了_Student__name,所以,仍然可以通過(guò)_Student__name來(lái)訪問(wèn)__name變量PART5繼承和多態(tài)5繼承與多態(tài)在OOD程序設(shè)計(jì)中,當(dāng)定義一個(gè)class的時(shí)候,可以從某個(gè)已有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Baseclass、Superclass)。classAnimal(object):defrun(self):print('Animalisrunning...’)classDog(Animal):passclassCat(Animal):pass5繼承與多態(tài)也可以對(duì)子類增加一些方法,比如Dog類classDog(Animal):defrun(self):print('Dogisrunning...')defeat(self):print('Eatingmeat...')5繼承與多態(tài)繼承的第二個(gè)好處,可以對(duì)子類代碼做一點(diǎn)改進(jìn),因?yàn)闊o(wú)論是Dog還是Cat,它們r(jià)un()的時(shí)候,顯示的都是Animalisrunning……,符合邏輯的做法應(yīng)是分別顯示Dogisrunning……和Catisrunning……classDog(Animal):defrun(self):print('Dogisrunning...')classCat(Animal):defrun(self):print('Catisrunning...')5繼承與多態(tài)可以發(fā)現(xiàn),新增一個(gè)Animal的子類,不必對(duì)run_twice()做任何修改,照樣可以執(zhí)行Tortoise子類的run方法。實(shí)際上,任何依賴Animal作為參數(shù)的函數(shù)或者方法都可以不加修改地正常運(yùn)行,原因就在于多態(tài)。
多態(tài)的好處就是,當(dāng)需要傳入Dog、Cat、Tortoise……時(shí),只需要接收Animal類型就可以了,因?yàn)镈og、Cat、Tortoise……都是Animal類型,然后,按照Animal類型進(jìn)行操作即可。由于Animal類型有run()方法,因此,傳入的任意類型,只要是Animal類或者子類,就會(huì)自動(dòng)調(diào)用實(shí)際類型的run()方法,這就是多態(tài)的意思。5繼承與多態(tài)PART6獲取對(duì)象信息6獲取對(duì)象信息1.使用type()函數(shù)>>>type(123)<class'int'>>>>type('str')<class'str'>>>>type(None)<type(None)'NoneType'>>>>type(abs)<class'builtin_function_or_method'>>>>type(a)<class'__main__.Animal'>6獲取對(duì)象信息2.使用isinstance()函數(shù)isinstance()可以告訴我們,一個(gè)對(duì)象是否是某種類型>>>a=Animal()>>>d=Dog()>>>h=Husky()>>>isinstance(h,Husky)True6獲取對(duì)象信息3.使用dir()函數(shù)要獲得一個(gè)對(duì)象的所有屬性和方法,可以使用dir()函數(shù),它返回一個(gè)包含字符串的list,比如,獲得一個(gè)str對(duì)象的所有屬性和方法>>>dir('ABC')['__add__','__class__',...,'__subclasshook__','capitalize','casefold',...,'zfill']PART7實(shí)例屬性和類屬性6獲取對(duì)象信息由于Python是動(dòng)態(tài)語(yǔ)言,根據(jù)類創(chuàng)建的實(shí)例可以任意綁定屬性。給實(shí)例綁定屬性的方法是通過(guò)實(shí)例變量,或者通過(guò)self變量classStudent(object):def__init__(self,name):=names=Student('Bob')s.score=90PART8案例研究:壁球模擬8案例研究:壁球模擬回顧壁球模擬程序作用:模擬多場(chǎng)比賽兩名對(duì)手的能力:以他們?cè)诎l(fā)球時(shí)獲勝的概率來(lái)表示程序輸入:選手A和選手B的概率以及游戲的模擬次數(shù)程序輸出:輸出比賽結(jié)果我們一起來(lái)研究壁球模擬案例吧!考慮一下零封的情況并記錄每名選手勝利的次數(shù)和零封的次數(shù)。8案例研究:壁球模擬回顧
當(dāng)其中一名選手達(dá)到15分時(shí),比賽結(jié)束。況。如果一名選手在另一名選手得分之前得到7分,那么游戲就結(jié)束了。我們的模擬程序應(yīng)該記錄每名選手勝利的次數(shù)和零封的次數(shù)。下面,我們一起來(lái)看一下該如何改進(jìn)吧!原版模擬程序若一名選手在另一名選手得分之前得到7分,那么游戲就結(jié)束。存在的問(wèn)題改進(jìn)任務(wù)我們一起來(lái)看一下該如何改進(jìn)吧!8案例研究:壁球模擬候選對(duì)象和方法問(wèn)題描述:模擬程序需要模擬兩名選手之間的一系列壁球比賽,并記錄關(guān)于一系列游戲的一些統(tǒng)計(jì)數(shù)據(jù)。需要做的兩件事:模擬游戲并記錄一些統(tǒng)計(jì)數(shù)據(jù)。8案例研究:壁球模擬候選對(duì)象和方法模擬游戲一個(gè)對(duì)象代表一局壁球游戲創(chuàng)建一局新游戲指定選手的技能水平有一個(gè)RBallGame類,它帶有一個(gè)構(gòu)造函數(shù),并需要兩名選手的概率參數(shù)8案例研究:壁球模擬候選對(duì)象和方法theGame=RBallGame(probA,probB)theGame.play()創(chuàng)建并打一場(chǎng)壁球比賽:若要進(jìn)行多場(chǎng)比賽,只需要使用一個(gè)循環(huán)表達(dá)式。8案例研究:壁球模擬候選對(duì)象和方法B的獲勝數(shù)A的獲勝數(shù)A的零封數(shù)B的零封數(shù)模擬的摘要模擬的比賽局?jǐn)?shù)打印通過(guò)A和B的勝利之和計(jì)算。組成一個(gè)對(duì)象SimStats類的實(shí)例8案例研究:壁球模擬候選對(duì)象和方法SimStats對(duì)象記錄有關(guān)一系列比賽的所有信息考慮該對(duì)象需要哪些操作構(gòu)建方法將所有計(jì)數(shù)初始化為0。8案例研究:壁球模擬候選對(duì)象和方法update方法在每場(chǎng)新比賽被模擬時(shí)更新計(jì)數(shù)。統(tǒng)計(jì)的更新基于比賽的結(jié)果統(tǒng)計(jì)對(duì)象發(fā)送信息確保更新可以正確進(jìn)行發(fā)送整個(gè)比賽,并讓update提取所需的任何信息8案例研究:壁球模擬候選對(duì)象和方法printReport方法打印統(tǒng)計(jì)報(bào)告。defmain():printIntro()probA,probB,n=getInputs()#開始游戲stats=SimStats()實(shí)際編寫程序的主函數(shù):8案例研究:壁球模擬候選對(duì)象和方法foriinrange(n):#創(chuàng)建新游戲theGame=RBallGame(probA,probB)#進(jìn)行游戲theGame.play()#獲取完成游戲后的信息stats.update(theGame)#打印結(jié)果stats.printReport()實(shí)際編寫程序的主函數(shù)(續(xù)上):8案例研究:壁球模擬實(shí)現(xiàn)SimStatsclassSimStats: def__init__(self): self.winsA=0 self.winsB=0 self.shutsA=0 self.shutsB=0SimStats的構(gòu)造方法:只需將四個(gè)計(jì)數(shù)初始化為0。8案例研究:壁球模擬實(shí)現(xiàn)SimStatsdefupdate(self,aGame):update方法:需要一個(gè)比賽對(duì)象作為普通參數(shù)并必須相應(yīng)地更新四個(gè)計(jì)數(shù)。具體該怎么做呢?分析需要知道比賽的最終得分,但是這個(gè)信息在aGame中。aGame的實(shí)例變量不允許直接訪問(wèn)。8案例研究:壁球模擬實(shí)現(xiàn)SimStatsRBallGame類新增getScores方法:返回選手A的得分和選手B的得分。defupdate(self,aGame):a,b=aGame.getScores()ifa>b:#A贏得比賽update的算法:8案例研究:壁球模擬實(shí)現(xiàn)SimStats self.winsA=self.winsA+1ifb==0:self.shutsA=self.shutsA+1else:#B贏得比賽self.winsB=self.winsB+1ifa==0:self.shutsB=self.shutsB+1update的算法:8案例研究:壁球模擬實(shí)現(xiàn)SimStats500場(chǎng)游戲的結(jié)果:勝(%總場(chǎng)數(shù))完勝(%獲勝)--------------------------------------------選手A:406(81.2%)66(16.3%)選手B:94(18.8%)4(4.3%)示例輸出結(jié)果:注意,必須避免在計(jì)算沒有獲得任何勝利的選手的零封百分比時(shí)除以0。8案例研究:壁球模擬實(shí)現(xiàn)SimStatsdefprintReport(self):#打印報(bào)告格式n=self.winsA+self.winsBprint(n,"場(chǎng)游戲的結(jié)果:\n")print("勝(%總場(chǎng)數(shù))完勝(%獲勝)")print("--------------------------------------------")self.printLine("A",self.winsA,self.shutsA,n)self.printLine("B",self.winsB,self.shutsB,n)printReport方法:
printLine方法的參數(shù)需要選手標(biāo)簽(A或B)、勝利和零封局?jǐn)?shù)以及比賽總數(shù)。8案例研究:壁球模擬實(shí)現(xiàn)SimStatsdefprintLine(self,label,wins,shuts,n):template="選手{0}:{1:5}({2:5.1%}){3:11}({4})"ifwins==0:#避免除以0shutStr="-----"else:shutStr="{0:4.1%}".format(float(shuts)/wins)print(template.format(label,wins,float(wins)/n,shuts,shutStr))printLine方法:定義模板8案例研究:壁球模擬實(shí)現(xiàn)RBallGame已經(jīng)確定的信息:需要一個(gè)構(gòu)造方法并接受兩個(gè)概率作為參數(shù)一個(gè)play方法進(jìn)行比賽通過(guò)GPA對(duì)列表進(jìn)行排序RBallGame類8案例研究:壁球模擬實(shí)現(xiàn)RBallGame進(jìn)行一局比賽必須記住每名選手的概率、每名選手的得分以及哪名選手在發(fā)球。選手相關(guān)的屬性概率得分選手間的“比賽”屬性發(fā)球只需考慮比賽選手是誰(shuí)、誰(shuí)正在發(fā)球。選手本身可以是對(duì)象并知道他們的概率和得分。8案例研究:壁球模擬實(shí)現(xiàn)RBallGamedef__init__(self,probA,probB):#通過(guò)給定的概率創(chuàng)建新游戲self.playerA=Player(probA)self.playerB=Player(probB)self.server=self.playerA#選手A總是先發(fā)球RBallGame的構(gòu)造方法:theGame=RBallGame(.6,.5)創(chuàng)建RBallGame實(shí)例:8案例研究:壁球模擬實(shí)現(xiàn)RBallGame回顧我們需要弄清楚如何比賽。壁球的討論
我們需要一個(gè)算法,繼續(xù)發(fā)球回合,或者得分,要么換發(fā)球,直到比賽結(jié)束。8案例研究:壁球模擬實(shí)現(xiàn)RBallGame只要比賽沒有結(jié)束,就需要一個(gè)循環(huán)繼續(xù)。無(wú)論比賽是否結(jié)束,只能通過(guò)查看比賽對(duì)象本身做出決定。defplay(self): whilenotself.isOver():用isOver方法判斷比賽是否結(jié)束:在play方法開始的時(shí)候使用isOver方法8案例研究:壁球模擬實(shí)現(xiàn)RBallGame循環(huán)選手發(fā)球根據(jù)結(jié)果決定要做什么Player對(duì)象應(yīng)有一個(gè)執(zhí)行發(fā)球的方法。ifself.server.winsServe():詢問(wèn)發(fā)球選手這次發(fā)球贏或輸:8案例研究:壁球模擬實(shí)現(xiàn)RBallGame需要改變選手的得分,即需要增加得分。得分
換發(fā)球是在比賽層面上完成的。因?yàn)樵撔畔⒈4嬖赗BallGame的server實(shí)例變量中。換發(fā)球8案例研究:壁球模擬實(shí)現(xiàn)RBallGamedefplay(self): whilenotself.isOver(): ifself.server.winsServe(): self.server.incScore() else: self.changeServer()play方法:self是一個(gè)RBallGame當(dāng)比賽還未結(jié)束時(shí),如果發(fā)球選手贏得發(fā)球回合,發(fā)球選手得分,否則換發(fā)球。8案例研究:壁球模擬實(shí)現(xiàn)RBallGameRBallGame類Player類isOverchangeServerwinsServeincScore8案例研究:壁球模擬實(shí)現(xiàn)RBallGameRBallGame類getScores返回兩名選手的得分。再次遇到同樣的問(wèn)題時(shí),選手的對(duì)象實(shí)際上知道得分。defgetScores(self): returnself.playerA.getScore(),self.playerB.getScore()要求選手返回得分:8案例研究:壁球模擬實(shí)現(xiàn)PlayerPlayer類封裝選手的發(fā)球獲勝概率和當(dāng)前分?jǐn)?shù)。構(gòu)造方法winsServeincScoregetScore8案例研究:壁球模擬實(shí)現(xiàn)Playerdef__init__(self,prob):#利用該概率創(chuàng)建一個(gè)選手 b=prob self.score=0player的構(gòu)造函數(shù):得分從0開始將選手的概率作為參數(shù)傳遞8案例研究:壁球模擬實(shí)現(xiàn)PlayerdefwinsServe(self): returnrandom()<b將概率與0~1之間的隨機(jī)數(shù)進(jìn)行比較:defincScore(self): self.score=self.score+1
選手得分,此時(shí)score加1:8案例研究:壁球模擬實(shí)現(xiàn)Player
defgetScore(self): returnself.score返回score的值:課程目標(biāo)小結(jié)希望大家能夠理解面向?qū)ο笤O(shè)計(jì)的過(guò)程,并通過(guò)兩個(gè)案例的研究能夠閱讀和設(shè)計(jì)中等復(fù)雜度的程序,以及了解封裝、多態(tài)和繼承的概念。課程目標(biāo)實(shí)踐任務(wù)1.修改第10章的壁球模擬程序,要求程序能記錄每名選手勝利的次數(shù)和零封的次數(shù)。課程目標(biāo)實(shí)踐任務(wù)2.編寫一個(gè)游戲程序,允許用戶用骰子玩撲克視頻游戲。課程目標(biāo)課后習(xí)題選擇題1.以下__
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度美術(shù)收藏品買賣合同模板4篇
- 2025年版學(xué)校校園廣告位租賃與運(yùn)營(yíng)承包合同2篇
- 二零二五年度煤炭資源整合居間代理合同4篇
- 二零二五年度煤炭運(yùn)輸車輛安全技術(shù)改造合同4篇
- 2025年度樓頂設(shè)備平臺(tái)租賃與使用合同4篇
- 二零二五年度生態(tài)園林養(yǎng)護(hù)與管理服務(wù)合同4篇
- 二零二五版包水管工程綠色環(huán)保材料選用合同2篇
- 二零二五年環(huán)境監(jiān)測(cè)儀器租賃合同2篇
- 二零二五年度現(xiàn)代農(nóng)業(yè)臨時(shí)工勞動(dòng)合同4篇
- 2025年玻璃工藝品設(shè)計(jì)與生產(chǎn)采購(gòu)合作協(xié)議3篇
- DB43-T 2897-2023 竹纖維復(fù)合波紋管材技術(shù)規(guī)范
- 人情往來(lái)(禮金)賬目表
- 二年級(jí)語(yǔ)文下冊(cè)背誦內(nèi)容(全部)
- 繪本《圖書館獅子》原文
- 給水管道施工與安裝技術(shù)要求(課件)
- 警輔 培訓(xùn) 課件
- 安全使用公共WiFi網(wǎng)絡(luò)的方法
- 法拍輔助工作管理制度
- 中控室保密與信息安全政策
- 后端開發(fā)年終總結(jié)
- 2023年管理學(xué)原理考試題庫(kù)附答案
評(píng)論
0/150
提交評(píng)論