Python程序開發基礎 課件 項目8 活學活用面向對象_第1頁
Python程序開發基礎 課件 項目8 活學活用面向對象_第2頁
Python程序開發基礎 課件 項目8 活學活用面向對象_第3頁
Python程序開發基礎 課件 項目8 活學活用面向對象_第4頁
Python程序開發基礎 課件 項目8 活學活用面向對象_第5頁
已閱讀5頁,還剩38頁未讀, 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目8活學活用面向對象項目內容獲取網頁數據設計人機猜拳游戲0102項目目標知識目標熟悉面向對象的概念熟悉類的創建和對象的訪問方法熟悉構造方法和析構方法熟悉類的繼承和方法的重寫了解類方法和靜態方法會創建類和定義對象會通過訪問對象的成員進行數據處理會利用構造方法和析構方法解決實際問題會利用類的繼承及多態處理問題技能目標

獲取網頁數據01

面向對象程序設計(簡稱OOP)是一種把面向對象的思想應用于程序設計的軟件開發方法。它可以使得軟件設計更加靈活,更能實現代碼復用和設計復用,其代碼具有更好的可讀性和可擴展性。

面向對象是基于對象概念,以對象為中心,以類和繼承為構造機制,來認識、理解、刻畫客觀世界;面向對象程序設計是將數據以及對數據的操作封裝在一起,組成一個相互依存、不可分割的整體,即對象。通過對相同類型的對象進行分類、抽象后,得出共同的特征而形成了類。面向對象程序設計的關鍵就是如何合理地定義和組織這些類以及類之間的關系。面向對象程序設計中的概念主要包括:對象、類、抽象、繼承、封裝、多態性。Python完全采用了面向對象程序設計的思想,是真正面向對象的高級動態編程語言。Python中的一切都可以看作是對象,譬如,數值、字符串、列表、元組、字典、集合等等。Python完全支持面向對象的封裝、繼承、多態以及對基類方法的覆蓋或重寫等基本功能。類和對象面向對象的思想中提出了兩個概念:類和對象。類:類是對多個對象共同特征的抽象描述,它是對象的模板。將具有相同屬性及相同行為的一組對象稱為類(class)。類提供一個抽象的描述,其內部包括屬性和方法兩個主要部分,類可以說是創建對象時所使用的模板。類的定義類中可以定義數據成員即屬性和成員函數即方法,屬性用于描述對象特征,方法用于描述對象行為。定義格式如下:class類名:

屬性名=屬性值def方法名(self):

方法體class類名(object):

屬性名=屬性值def方法名(self):

方法體注意:類名采用駝峰命名法?;蚱┤纾篶lassCar:wheel=4name=“寶馬”defdirve(self):print(“開車”)defstop(self):print(“停車”)classStudent(object):age=19grade=“university”defstudy(self):print(“我愛學習”)defexper(self):print(“我愛實驗”)對象及創建對象(object)是現實世界中可描述的事物,它可以是有形的也可以是無形的。對象可以是有生命的個體,譬如,一個人或一只鳥。對象也可以是無生命的個體,譬如,一輛車或一臺電腦。對象還可以是一個抽象的概念,譬如,天氣的變化或一場運動會。對象是構成世界的一個獨立單位,它由數據(描述事物的屬性)和作用于數據的操作(體現事物的方法)構成一個獨立整體。何為對象類定義完成后不能直接使用,需要實例化為對象才能實現其意義。對象的創建:對象名=類名()譬如:my_car1=Car()my_car2=Car()stu1=Student()stu2=Student()創建對象

若想在程序中真正地使用對象,需掌握訪問對象成員的方法。對象成員分為屬性和方法,其訪問格式分別如下:譬如:my_my_car1.drive()my_car2.wheelMy_car2.stop()stu1.gradestu1.study()stu2.agestu2.study()對象名.屬性對象名.方法()訪問對象成員訪問限制

類中定義的屬性和方法都默認為公有屬性和方法,由該類創建的對象可以任意訪問類的公有成員。

為了契合封裝原則,保證類成員不被對象輕易訪問。Python支持將類中的成員設置為私有成員,在一定程度上限制了對象對類成員的訪問。Python通過在類成員名前添加雙下劃線(__)來限制成員的訪問權限。語法格式如下:__屬性名__方法名定義一個包含私有屬性__weight和私有方法__info()的類PersonInfo。譬如:classPersonInfo(object):__weight=45#私有屬性def__info(self):#私有方法print(f"我的體重是:{__weight}kg")創建私有成員訪問私有成員創建PersonInfo類的對象person,通過該對象訪問類的屬性:classPersonInfo(object):__weight=45#私有屬性def__info(self):#私有方法print(f"我的體重是:{__weight}kg")person=PersonInfo()person.__weightperson.__info()AttributeError:'PersonInfo'objecthasnoattribute'__weight'對象無法直接訪問類的私有成員!!!

私有屬性可在公有方法中通過指代對象本身的默認參數“self”訪問,類外部可通過公有方法間接獲取類的私有屬性。私有方法同樣在公有方法中通過參數“self”訪問classPersonInfo(object):__weight=55#私有屬性def__info(self):#私有方法print(f"我的體重是:{__weight}kg")

defget_weight(self):#公有方法print(f"我的體重是:{self.__weight}kg")

self.__info()person=PersonInfo()person.get_weight()特殊方法Python系統內置了幾個特殊的方法,它們是構造方法與析構方法、類方法和靜態方法。構造方法每個類都有一個默認的__init__()方法,即構造方法。如果定義類時顯式地定義__init__()方法,那么創建對象時Python解釋器會調用顯式定義的__init__()方法;如果定義類時沒有顯式定義__init__()方法,那么Python解釋器會調用默認的__init__()方法。__init__()方法按照參數的有無(self除外)可分為無參構造方法和有參構造方法。無參構造方法:無參構造方法中可以為屬性設置初始值,此時使用該方法創建的所有對象都具有相同的初始值。有參構造方法:有參構造方法中可以使用參數為屬性設置初始值,此時使用該方法創建的所有對象都具有不同的初始值。

定義一個Information類,在該類中顯式地定義一個帶有3個參數的__init__()方法。classInforamtion(object):def__init__(self,name,sex):=nameself.sex=sexinfomation=Inforamtion(‘李理','女')前面在類中定義的屬性是類屬性,可以通過對象或類進行訪問;在構造方法中定義的屬性是實例屬性,只能通過對象進行訪問。實例1:計算學生成績。定義一個學生類,具體要求如下:1.有如下屬性:姓名、年齡、成績(語文,數學,英語),其中每科成績的類型為整數。2.有如下方法獲取學生的姓名:get_name(),返回值類型為str;獲取學生的年齡:get_age(),返回值類型為int。返回3門科目中的最高分:get_course(),返回類型為int。寫好類以后,定義一個學生實例進行測試。classStudnet(object):def__init__(self,name,age,score):=nameself.age=ageself.score=scoredefget_name(self):returndefget_age(self):returnself.agedefget_course(self):returnmax(self.score)zm=Studnet('Gaoyong',20,[82,96,88])print(zm.get_name())print(zm.get_age())print(zm.get_course())析構方法

當一個對象的引用計數器數值為0時,就會調用__del__()方法,這個方法就是類的析構方法。importsysclassDestruction(object):def__del__(self):print('對象被釋放')destruction=Destruction()print(sys.getrefcount(destruction))Python的析構方法采用的是垃圾回收機制。Python中的垃圾回收主要采用的是引用計數。引用計數是一種內存管理技術,它通過引用計數器記錄所有對象的引用數量,當對象的引用計數器數值為0時,就會將該對象視為垃圾進行回收。getrefcount()函數是sys模塊中用于統計對象引用數量的函數,其返回結果通常比預期的結果大1。這是因為getrefcount()函數也會統計臨時對象的引用。類方法實例方法定義時只比普通函數多一個self參數的方法稱為實例方法,它只能通過類實例化的對象調用。classCar:

wheels=4

#

屬性

defdrive(self):

#實例方法

print(‘開車方法')類方法與實例方法的不同點:類方法實例方法利用裝飾器@classmethod修飾—類方法的第一個參數為cls,它代表類本身實例方法的第一個參數為self,它代表對象本身既可以由對象調用,也可以直接由類調用只能由對象調用可以修改類屬性無法修改類屬性定義類方法類方法可以被類名或對象名調用,其語法格式如下:類名.類方法對象名.類方法修改類屬性在實例方法中無法修改類屬性的值,但在類方法中可以修改類屬性的值。classApple(object):count=0defadd_one(self):#實例方法

self.count=1@classmethoddefadd_two(cls):#類方法cls.count=2apple=Apple()apple.add_one()print(Apple.count)Apple.add_two()print(Apple.count)02靜態方法靜態方法與實例方法的不同:靜態方法實例方法使用裝飾器@staticmethod修飾——方法中需要以“類名.方法/屬性名”的形式訪問類的成員方法中需要以“self.方法/屬性名”的形式訪問類的成員既可由對象調用,亦可由類調用只能由對象調用定義一個包含屬性num與靜態方法static_method()的類Example。classExample:num=10#類屬性@staticmethod#定義靜態方法defstatic_method():print(f"類屬性的值為:{Example.num}")print("靜態方法")任務實踐-獲取網頁數據寫一個網頁數據操作類(提示:需要用到urllib模塊)。完成以下功能:(1)get_httpcode():獲取網頁的狀態碼并返回結果;例如:200,301,404等,類型為int。(2)get_htmlcontent():獲取網頁的內容,返回類型為str。(3)get_linknum():計算網頁的鏈接數目。本任務要求編寫程序,定義網頁類page_data,分別創建get_httpcode()、get_htmlcontent()、get_linknum()方法,通過構造方法獲取百度網頁的數據。代碼如下:#獲取網頁數據importurllib.requestclassPage_data(object):def__init__(self,url_add):self.url=url_adddefget_httpcode(self):status=urllib.request.urlopen(self.url).codereturnstatusdefget_htmlcontent(self):contentstr=urllib.request.urlopen(self.url).read()returncontentstrdefget_linknum(self):content=urllib.request.urlopen(self.url).read()returnlen(content.decode('utf-8').split('<ahref'))-1

A=Page_data('')print(A.get_httpcode())print(A.get_htmlcontent())print(A.get_linknum())

設計人機猜拳游戲02

俗話說“老貓房上睡,一輩傳一輩”,“老鼠的兒子會打洞”,這些話說出了自然界的繼承關系。Python中類與類之間也同樣具有繼承關系。Python中類與類之間具有繼承關系,其中被繼承的類稱為父類或基類,繼承的類稱為子類或派生類。子類在繼承父類時,會自動擁有父類中的方法和屬性。類的繼承單繼承與多繼承單繼承單繼承指的是子類只繼承一個父類,其語法格式如下:class子類(父類)譬如:定義一個表示兩棲動物的父類Amphibian和一個表示青蛙的子類Frog。classAmphibian(object):name="兩棲動物"deffeatures(self):print("幼年用鰓呼吸")print("成年用肺兼皮膚呼吸")classFrog(Amphibian):defattr(self):print(f"青蛙是{}")print("我會呱呱叫")frog=Frog()print()frog.features()frog.attr()單繼承與多繼承多繼承多繼承指的是一個子類繼承多個父類,其語法格式如下:class子類(父類A,父類B,...):譬如:定義English類、Math類與Student類,使Student類繼承English類與Math類。classEnglish:defeng_know(self):print('具備英語知識。')classMath:defmath_know(self):print('具備數學知識。')classStudent(English,Math):defstudy(self):print('學生的任務是學習。')stu=Student()stu.eng_know()stu.math_know()stu.study()classHorse(object):defrun(self):print("馬兒奔跑")classDonkey(object):defrun(self):print("驢兒打滾")classMule(Horse,Donkey):passmule=Mule()mule.run()又譬如:定義Horse類、Donkey類與Mule類,使Mule類繼承Horse類與Donkey類。方法的重寫

子類可以繼承父類的屬性和方法,若父類的方法不能滿足子類的要求,子類可以重寫父類的方法,以達到理想的需求。父類定義如下:classCat(Felines):name="貓"defspeciality(self):print(f'{}會抓老鼠')print(f'{}會爬樹')子類定義如下:classFelines:defspeciality(self):print("貓科動物特長是爬樹")#父類定義如下classFelines:defspeciality(self):print("貓科動物特長是爬樹")#子類定義如下classCat(Felines):name="貓"defspeciality(self):print(f'{}會抓老鼠')print(f'{}會爬樹')cat=Cat()cat.speciality()運行結果是:貓會抓老鼠貓會爬樹>>>從運行結果可以看到,子類Cat重寫了父類Felines的父類的speciality()方法super()函數如果子類重寫了父類的方法,但仍希望調用父類中的方法,那么可以使用super()函數實現。super()只能在子類中使用,用于調用父類中的方法。super().方法名()classFelines:defspeciality(self):print("貓科動物特長是爬樹")classCat(Felines):name="貓"defspeciality(self):print(f'{}會抓老鼠')print(f'{}會爬樹')cat=Cat()cat.speciality()super().speciality()多態在Python中,多態指在不考慮對象類型的情況下使用對象。相比于強類型,Python更推崇“鴨子類型”。“鴨子類型”是這樣推斷的:如果一只生物走起路來像鴨子,游起泳來像鴨子,叫起來也像鴨子,那么它就可以被當做鴨子。也就是說,“鴨子類型”不關注對象的類型,而是關注對象具有的行為。Python中并不需要顯式指定對象的類型,只要對象具有預期的方法和表達式操作符,就可以使用對象。classRabbit(Animal):defmove(self):print("兔子蹦蹦跳跳")classSnail(Animal):defmove(self):print("蝸牛緩慢爬行")deftest(obj):obj.move()Rabbit和Snail類中都有move()方法,都可以傳遞給test()函數

實例2:統計參加長跑的名單及人數。學校舉辦十公里長跑活動,在報名的過程中允許報過名的同學退出,在活動當天會報出參加活動的運動員名單和人數。本實例要求使用類的繼承來編程,完成統計參加長跑的名單和人數的功能。classMarathon(object):def__init__(self,name,yn):self.yn=yn=namedefins(self):if(self.yn=='y'):list1.append()else:list1.remove()returnlist1classSportsman(Marathon):passss=0list1=[]whileTrue:g=input('參加/退出/停止(y/n/s):')if(g=='s'):breakn=input('姓名:')person=Sportsman(n,g)person.ins()print('參加長跑的名單如下:')fornainlist1:print(na,end='')print(f'\n參加人數有:{len(list1)}人')任務實踐-設計人機猜拳游戲

猜拳游戲又稱“猜丁殼”,是一個古老、簡單的游戲,常用來解決爭議的情況。猜拳游戲有三種手勢表示,即剪子、石頭、布。游戲規則是:剪子勝布、石頭勝剪子、布勝石頭。

本任務是編寫程序,實現人機猜拳游戲。要求采用面向對象的程序設計思想。代碼如下:#設計人機猜拳游戲importrandomclassPlayer:def__init__(self):self.dict={0:'剪刀',1:'石頭',2:'布'}#手勢defgesture(self):player_input=int(input("請輸入(0剪刀、1石頭、2布:)"))returnself.dict[player_input]classAIPlayer(Player):play_data=[]defai_gesture(self):whileTrue:computer=random.randint(0,2)iflen(self.play_data)>=4:#獲取玩家出拳的最大概率max_prob=max(self.play_data,key=self.play_data.count)ifmax_prob=='剪刀':return'石頭'elifmax_prob=='石頭':return'布'e

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論