




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第9章面向對象程序設計面向對象概述封裝繼承多態實戰14:模擬薪資結算自定義異常類理解面向對象的基本概念掌握面向對象的三大特性封裝、繼承和多態了解自定義異常類的方法9.1面向對象概述面向對象的基本概念面向對象的三大特性9.1面向對象概述9.1.1面向對象的基本概念面向過程的程序設計是一種自上而下的設計方法,圍繞事件進行,分析出解決問題的步驟,劃分任務并逐步實現功能。面向過程的程序設計往往一個過程只能解決一個問題,對于復雜問題難以進行設計,如果有需求變動,則會牽一發而動全身。面向對象是一種自底而上的設計方法。面向對象程序設計(Object-OrientedProgramming,OOP)用于描述客觀世界中的事物,每一個具體的事物都是一個對象,同類型的對象擁有共同的屬性和行為,則形成了類,這一過程就是抽象。抽象是面向對象程序設計的本質,類是其關鍵,類與對象是抽象與具體的對應。面向對象程序設計將數據和操作看成一個整體,可以提高程序的開發效率,使得程序結構清晰,增加程序的可維護性,提高代碼的可復用性。9.1面向對象概述9.1.2面向對象的三大特性面向對象程序設計的主要特征可以概括為:封裝繼承多態9.1面向對象概述9.1.2面向對象的三大特性-封裝封裝是面向對象程序設計的核心思想,將對象的屬性和行為封裝起來,避免了外界直接訪問對象而造成的過度依賴,也阻礙了外界修改對象的內部數據而可能引發的難以預見的結果。9.1面向對象概述9.1.2面向對象的三大特性-繼承繼承主要描述的是類與類之間的關系,是面向對象程序設計中提高重用性的重要措施。繼承可以在無需編寫原有類的情況下,對原有類的功能進行擴展,既包括原有類的所有屬性和行為,又可以定義自身的屬性和行為,稱為繼承了原有類。原有類稱為父類或者基類,繼承原有類的這個類稱為子類或派生類。9.1面向對象概述9.1.2面向對象的三大特性-多態多態是指屬性或者行為在基類及其派生類中具有不同的含義或者形式,多態特性使得開發更加科學以及符合人類的思維習慣。9.2封裝封裝的概念@property的使用9.2封裝9.2.1封裝的概念私有屬性和私有方法都屬于Python封裝的形式,通過在屬性和方法前加上兩個下劃線的方式,阻礙類外對類內屬性和方法的訪問和修改。但是Python中的私有屬性和私有方法不是完全私有化的,是一種通過改變名稱而阻礙類外訪問的方式,實際上,還是可以通過“_類名__屬性名”或者“_類名__方法名”的形式對其進行訪問。9.2封裝9.2.1封裝的概念定義Student類的私有屬性和私有方法classStudent:def__init__(self,score):self.__score=scoredef__get_score(self):returnself.__scores1=Student(100)print(s1._Student__score)#訪問私有屬性__scoreprint(s1._Student__get_score())#訪問私有方法__get_score()100100私有屬性和私有方法不能直接訪問,否則就會報錯。通過加上類名的形式進行訪問,能夠成功訪問,但是并不建議這種訪問方式。9.2封裝9.2.2@property的使用@property是Python內置的裝飾器,能夠修改屬性的讀寫權限classScore:def__init__(self,data):self.__data=data#定義私有屬性__data@property#使用@property將屬性變為只讀的defdata(self):returnf"私有屬性的值為{self.__data}"s1=Score(60)print(s1.data)#訪問屬性私有屬性的值為60定義私有屬性self.__data,@property將其變為只讀的那么可以修改data的值嗎?9.2封裝9.2.2@property的使用Traceback(mostrecentcalllast):File"C:\1000phone\parter9\score.py",line9,in<module>s1.data=100AttributeError:can'tsetattribute如何使data變為可以修改的?s1.data=100出現AttributeError異常9.2封裝9.2.2@property的使用如果希望能將Score類中的私有屬性變為可修改的,需要通過@property裝飾的方法名后加“.setter”classScore:def__init__(self,data):self.__data=data#定義私有屬性__data@property#使用@property將屬性變為只讀的defdata(self):returnf"私有屬性的值為{self.__data}"@data.setter#使用data.setter將屬性變為可修改的defdata(self,value):ifvalue<0orvalue>100:raiseValueError("您的輸入有誤,輸入的范圍應該在0~100之間")else:self.__data=values1=Score(60)print(s1.data)s1.data=100print(s1.data)運行結果:私有屬性的值為60私有屬性的值為100第10行中的raise是什么意思?9.2封裝9.2.2@property的使用-raise語句raise語句,用于主動拋出異常raise異常類型(異常說明)9.2封裝9.2.2@property的使用-raise語句s1.data=-1Traceback(mostrecentcalllast):File"C:\1000phone\parter9\score_2.py",line15,in<module>s1.data=-1File"C:\1000phone\parter9\score_2.py",line10,indataraiseValueError("您的輸入有誤,輸入的范圍應該在0~100之間")ValueError:您的輸入有誤,輸入的范圍應該在0~100之間主動拋出ValueError異常9.3繼承單一繼承方法重寫多重繼承9.3繼承9.3.1單一繼承class基類名:#也可以寫成class基類名(object):類體class派生類名(基類名):類體單一繼承是指定義的派生類只有一個基類派生類繼承自基類,可以使用基類中的所有公有成員,不能使用基類中的私有成員。派生類可以定義新的屬性和方法,從而完成對基類的擴展。注意Python中所有的類都繼承自object類,這種繼承寫法可以省略。9.3繼承9.3.1單一繼承classAnimal:def__init__(self,name,age):=name#姓名屬性self.age=age#年齡屬性defeat(self):#吃飯行為print(f"{}正在吃東西")defsleep(self):#睡覺行為print(f"{}正在睡覺")classDog(Animal):#Dog類繼承Animal類的屬性和方法passclassCat(Animal):#Cat類繼承Animal類的屬性和方法defplay(self):#在Cat類中創建新的方法print(f"{}正在玩耍")if__name__=="__main__":my_dog=Dog("小汪",4)#創建Dog類的實例對象my_dog.eat()#調用基類中的方法my_cat=Cat("小喵",2)#創建Cat類的實例對象my_cat.play()#調用Cat類中的方法運行結果:小汪正在吃東西小喵正在玩耍9.3繼承9.3.2方法重寫-重寫構造方法classAnimal:def__init__(self,name,age):=name#姓名屬性self.age=age#年齡屬性classDog(Animal):#Dog類繼承Animal類的屬性和方法def__init__(self,name,age,vaccine):super().__init__(name,age)#繼承Animal類中的屬性self.vaccine=vaccine#是否打過疫苗屬性if__name__=="__main__":my_dog=Dog("小汪",4,"True")ifmy_dog.vaccine:print(f"{my_}打過疫苗了")else:print(f"{my_}還沒打過疫苗")運行結果:小汪打過疫苗了重寫Dog類中的構造方法super()是一個特殊函數,能夠調用基類的方法第7行代碼還可以寫成以下兩種形式:super(Dog,self).__init__(name,age)Animal.__init__(self,name,age)9.3繼承9.3.3多重繼承多重繼承是指派生類繼承了多個基類class基類1:類體class基類2:類體class派生類(基類1,基類2):類體9.3繼承9.3.3多重繼承classStudent:def__init__(self,name,score):=nameself.score=scoredefstu_info(self):print(f"姓名:{},分數:{self.score}")classStaff:def__init__(self,id,salary):self.id=idself.salary=salarydefstaff_info(self):print(f"ID:{self.id},薪資:{self.salary}")classPartTimeStudent(Student,Staff):def__init__(self,name,score,id,salary):Student.__init__(self,name,score)Staff.__init__(self,id,salary)p1=PartTimeStudent("小千",100,"202201",10000)p1.stu_info()p1.staff_info()運行結果:姓名:小千,分數:100ID:202201,薪資:10000職員、學生與非全日制學生的多重繼承關系9.4多態多態的概念內置函數重寫運算符重載9.4多態9.4.1多態的概念多態的含義是“有多種形式”,在面向對象程序設計中,多態是指基類的同一個方法在不同派生類對象中具有不同的表現和行為,當調用該方法時,程序會根據對象選擇合適的方法。1+2"千鋒"+"教育"加法運算符對于不同類型的對象執行了不同的操作,也是多態的一種體現9.4多態9.4.1多態的概念importmathclassGraphic:def__init__(self,name):=namedefcal_square(self):passclassTriangle(Graphic):def__init__(self,name,height,border):super().__init__(name)self.height=heightself.border=borderdefcal_square(self):square=1/2*self.height*self.borderprint(f"{}的面積是{square:.2f}")classCircle(Graphic):def__init__(self,name,radius):super().__init__(name)self.radius=radiusdefcal_square(self):square=math.pi*pow(self.radius,2)print(f"{}的面積是{square:.3f}")t1=Triangle("三角形",6,8)t1.cal_square()c1=Circle("圓",3)c1.cal_square()幾何圖形求面積的多態體現運行結果如下:三角形的面積是24.00圓的面積是28.2749.4多態9.4.2內置函數重寫在Python中,不僅能對自定義類中的方法進行重寫,還可以對Python已定義的內置函數進行重寫。比較常見的內置函數的重寫包括前文已經介紹過的str()和repr()函數。這兩個函數原本是用于將其它數據類型轉換為字符串形式,在類中對其重寫后,就能用于將對象轉化為字符串。重寫str()和repr()函數,需要在函數名前加兩個下劃線,函數名后加兩個下劃線:__str__()函數會將對象轉化為人更容易理解的字符串__repr__()函數會將對象轉換為解釋器可識別的字符串9.4多態9.4.2內置函數重寫classClock:def__init__(self,hour,minute,second):self.hour=hourself.minute=minuteself.second=secondc1=Clock(2,30,20)print(c1)<__main__.Clockobjectat0x0000028F0E3418E0>定義一個Clock類,未重寫內置函數9.4多態9.4.2內置函數重寫classClock:def__init__(self,hour,minute,second):self.hour=hourself.minute=minuteself.second=seconddef__str__(self):#重寫__str__()returnf"時{self.hour},分{self.minute},秒{self.second}"def__repr__(self):#重寫__repr__()returnf"Clock({self.hour},{self.minute},{self.second})"c1=Clock(10,20,30)#定義實例對象c1print(c1)#打印對象c1c2=eval(repr(c1))#克隆c1對象賦值給c2c2.hour=1#修改c2屬性print(c2)#打印對象c2時10,分20,秒30時1,分20,秒30定義一個Clock類,重寫內置函數9.4多態9.4.2內置函數重寫9.4多態9.4.3運算符重載“+”運算符的本質是調用了內置的__add__()方法。那么類的對象之間可以進行“+”操作嗎?“-”、“*”、“>”、“<”等運算符操作呢?運算符方法說明示例+__add__(self,other)加法a+b-__sub__(self,other)減法a-b*__mul__(self,other)乘法a*b/__truediv__(self,other)除法a/b%__mod__(self,other)求余a%b>__gt__(self,other)大于a>b>=__ge__(self,other)大于等于a>=b==__eq__(self,other)等于a==b<__lt__(self,other)小于a<b<=__le__(self,other)小于等于a<=b!=__ne__(self,other)不等于a!=b運算符對應的方法9.4多態9.4.3運算符重載classRace:def__init__(self,length,time):self.length=lengthself.time=timedef__add__(self,other):#重載+運算returnRace(self.length+other.length,self.time+other.time)def__gt__(self,other):#重載>運算ifself.length==other.length:returnself.time>other.timeelse:raiseTypeError("無法比較")def__eq__(self,other):#重載==運算ifself.length==other.length:returnself.time==other.timeelse:raiseTypeError("無法比較")def__str__(self):returnf"賽跑長度為{self.length},賽跑時長為{self.time}"if__name__=="__main__":team1_1=Race(200,20)#team1的1號隊員team1_2=Race(200,19.8)#team1的2號隊員team1=team1_1+team1_2#team1的總賽跑長度和時長print(team1)team2_1=Race(200,18.9)#team2的1號隊員team2_2=Race(200,20.1)#team2的2號隊員team2=team2_1+team2_2#team2的總賽跑長度和時長print(team2)ifteam1>team2:print("team2取得勝利")elifteam1==team2:print("team1和team2平局")else:print("team1取得勝利")運行結果:賽跑長度為400,賽跑時長為39.8賽跑長度為400,賽跑時長為39.0team2取得勝利計算接力賽的賽跑長度及時長,并判斷獲勝隊伍9.5實戰14:模擬薪資結算9.5實戰14:模擬薪資結算假設有個公司有三類員工,分別是產品經理、程序員以及測試工程師。三類員工的薪資計算方法如下。產品經理:按照固定工資分配。程序員:有基礎工資,加班有加班費,當加班時長不超過20小時,加班費為100元/小時;當加班時長超過20小時,就按20小時加班計算,超出部分不計入薪資。測試工程師:有基礎工資,存在績效薪資,每發現一個錯誤(Bug)即可以獲得5元績效薪資。9.5實戰14:模擬薪資結算9.5實戰14:模擬薪資結算isinstance()函數用于判斷一個對象是否屬于指定的類的實例或者其子類的實例isinstance(對象,類信息)classEmployee:passe1=Employee()ifisinstance(e1,Employee):print("e1屬于Employee的實例對象")else:print("e1不屬于Employee的實例對象")e1屬于Employee的實例對象類信息可以是可以是類名、基本類型或者由它們組成的元組。當對象屬于類信息時,會返回True,否則就會返回False。9.5實戰14:模擬薪資結算classEmployee:#員工類,作為基類def__init__(self,name):=name#定義屬性namedefget_salary(self):#定義獲取薪資的方法passclassManager(Employee):#定義產品經理類,繼承Employee類def__init__(self,name,salary=15000):super().__init__(name)#繼承父類屬性self.salary=salary#定義薪資salarydefget_salary(self):#重寫父類方法returnself.salarydef__str__(self):#重寫__str__()方法returnf"{}的薪資是{self.get_salary()}"classProgrammer(Employee):#定義程序員類,繼承Employee類def__init__(self,name,base_salary=12000,over_time=0):super().__init__(name)#繼承父類屬性self.base_salary=base_salary#定義基礎工資base_salaryself.__over_time=over_time#定義加班時長defget_salary(self):#重寫父類方法ifself.__over_time<0:raiseValueError("工作時長的輸入有誤")elifself.__over_time>20:self.__over_time=20#加班時長不能超過20小時,超出20小時不計入薪資returnself.base_salary+100*self.__over_timedef__str__(self):#重寫__str__()方法returnf"{}的薪資是{self.get_salary()}"classSoftTest(Employee):#定義測試工程師類,繼承Employee類def__init__(self,name,base_salary=8000,bug_num=0):super().__init__(name)#繼承父類屬性self.base_salary=base_salary#定義基礎工資base_salaryself.bug_num=bug_num#定義發現的錯誤個數bug_numdefget_salary(self):#重寫父類方法returnself.base_salary+5*self.bug_numdef__str__(self):#重寫__str__()方法returnf"{}的薪資是{self.get_salary()}"defmain():#定義計算所有員工工資的函數employee_list=[Manager("宋江"),Manager("吳用"),Manager("公孫勝",10000),Programmer("花榮"),Programmer("武松",10000,10),Programmer("林沖",13000,30),SoftTest("朱武"),SoftTest("蔣敬"),SoftTest("柴進",9000,100)]forempinemployee_list:ifisinstance(emp,Programmer):print("程序員:",emp)elifisinstance(emp,Manager):print("產品經理:",emp)else:print("測試工程師:",emp)if__name__=="__main__":main()運行結果:產品經理:宋江的薪資是15000產品經理:吳用的薪資是15000產品經理:公孫勝的薪資是10000程序員:花榮的薪資是12000程序員:武松的薪資是11000程序員:林沖的薪資是15000測試工程師:朱武的薪資是8000測試工程師:蔣敬的薪資是8000測試工程師:
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 日常急救知識的重要性
- 河北省衡水中學2022-2023學年高一上學期綜合素質檢測二政治試題
- 2024年蚌埠五河縣城區相關學校選調教師筆試真題
- 2025年中國輕型皮帶機行業市場調查、投資前景及策略咨詢報告
- 2025年中國超聲波藥品提取機行業投資前景及策略咨詢研究報告
- 2025年中國蓮花板行業投資前景及策略咨詢研究報告
- 2025年中國粘貼式扭線環行業投資前景及策略咨詢研究報告
- 2025年中國碳化硅爐膛行業投資前景及策略咨詢研究報告
- 2025年中國生產線前處理設備行業投資前景及策略咨詢研究報告
- 2025年中國熱固性塑料封裝壓機行業市場調查、投資前景及策略咨詢報告
- 起重設備維護保養記錄(完整版)
- 網絡信息安全培訓課件-PPT
- 北京市醫藥衛生科技促進中心關于印發《首都醫學科技創新成果轉化優促計劃實施方案(試行)的通知》
- (完整版)互聯網+項目策劃書
- THBLS 0011-2023 荊楚糧油 優質油菜籽生產技術規程
- 2023春國開社會調查研究與方法單元自測1-5試題及答案
- 美國AHA心肺復蘇指南
- 水資源規劃及利用智慧樹知到答案章節測試2023年長春工程學院
- HAND-成本模塊:移動平均成本-系統操作
- 慢阻肺匯總講解培訓課件
- GB 6000-1999主要造林樹種苗木質量分級
評論
0/150
提交評論