版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第4章類與對象主講人:***13-10月-23Python數據分析與數據挖掘目錄contents面向對象0102類和對象03類定義與使用04屬性方法05繼承0706運算符重載面向對象014.1面向對象面向對象定義:是針對面向過程這一思想的不足所提出的,是指以“對象”為核心反映現實中的事物,并以對象之間的消息傳遞描述事物之間的關系,從而構建程序。實施過程:首先依據對現實需求的分析抽象提取出多個對象,然后為其增加相應的屬性和功能,從而達到讓對象實現相關的動作。應用:數據庫系統(tǒng)、交互式界面、應用結構、應用平臺、分布式系統(tǒng)、網絡管理結構、CAD技術、人工智能等多個領域。優(yōu)點:較于面向過程,更適用于復雜化的程序,且易維護、易復用、易擴展,思維邏輯更加貼近于現實生活,更容易解決大型的復雜的業(yè)務邏輯。面向過程定義:它是以解決問題的過程為核心進行編程,是一種自頂向下、逐步細化的過程,更側重于過程之間的關系。存在問題:面對復雜的問題時,過程之間相互調用,步驟流程錯綜復雜,面向過程就很難解決,或者代碼會特別繁雜。類和對象024.2類和對象Python作為面向對象的語言,其實現基礎就是類和對象。類(class)是指具有相似特征和行為的事物的集合,是一種廣義的數據類型,支持定義復雜數據的特性,包括靜態(tài)特性(即數據抽象)和動態(tài)特性(即行為抽象,也就是對數據的操作方法),如:正方形、平行四邊形都屬于四邊形這一類,而四邊形的周長和面積則是對應的操作。對象是現實中該類事物的一個個體,是類的實例。一個類可以支持多個對象的創(chuàng)建,而創(chuàng)建類的一個實例的過程被稱為實例化。例如:鳥類是一個類,其中具備性別,年齡等屬性,會飛,鳴叫等是方法,而喜鵲、鳳凰、鸚鵡等鳥類是幾個對象。4.2類和對象類與對象的區(qū)別之處:類是對象的抽象,而對象是類的具體實例。類是抽象的,而對象是具體的。每一個對象都是某一個類的實例。每一個類在某一時刻都有零或更多的實例。類是靜態(tài)的,它們的存在、語義和關系在程序執(zhí)行前就已經定義好了,對象是動態(tài)的,它們在程序執(zhí)行時可以被創(chuàng)建和刪除。類是生成對象的模板。類定義與使用034.3類定義與使用類通過class定義,定義時類名一般需要首字母大寫。定義格式如下:class類名:
屬性名=屬性值 def__init__(self,x,y): self.XXX=x self.XXX=y
def方法名(self):
方法體 def方法名(self):
方法體說明:定義類與內置類地位相同,可以出現在代碼中的任何位置,最常見的是出現在模塊外層,通過import語句導入并使用。類屬性,是在類中方法之外定義的,可通過類名訪問。此外,類屬性也可通過對象訪問,但一般不建議這樣做,容易導致類屬性值不一致的情況。類方法,是對動態(tài)特征的抽象,一個類中可定義多個不同的方法,而每個方法的第一個參數都是self,其代表要創(chuàng)建的對象本身。此外,類方法只能通過對象來調用,即向類發(fā)消息請求對象執(zhí)行某個方法。class類名:
屬性名=屬性值
def__init__(self,x,y): self.XXX=x self.XXX=y def方法名(self):
方法體 def方法名(self):
方法體說明:構造函數(__init__)初始化程序,通常在創(chuàng)建和初始化這個類的新對象時被調用,Python提供一個默認的構造函數。如果類中沒有顯性定義__init__()方法,則創(chuàng)建對象時調用默認方法,不做任何操作,直接返回一個對象;如果類中顯性定義了__init__()方法,則創(chuàng)建對象時會優(yōu)先調用顯式方法。__init__()方法的第一個參數是self,表示正在創(chuàng)建的對象,可以通過方法體中的語句實現為對象的屬性賦值。該方法還可以有多個參數,創(chuàng)建對象時需要為這些參數提供實際值,從而實現對象屬性的操作。4.3類定義與使用類的使用是在主函數,具體語法格式如下:對象名=類名()對象名.方法名()【分析】:類定義放在CLASS.py文件中,在本例中使用到其中的Student類,采用導入模塊的形式將其導入。利用“Student”類創(chuàng)建一個對象名為“zhangsan”的對象,創(chuàng)建時采用Python默認的構造函數,并通過“類名.屬性”和“對象名.方法名”的方式訪問類屬性(age)和對應的方法(learning()和play()方法)。[例4-1]類的定義實例。4.3類定義與使用【分析】:類定義放在CLASS.py文件中,在本例中使用到其中的Student_new類。在類定義中定義了類屬性(age)、對象屬性(weight和height)和方法(BMI())。在主函數中創(chuàng)建一個名為“wangwu”的對象,創(chuàng)建時采用顯式定義的構造函數__init__,并將其初始化,傳入對象的身高和體重。以“對象名.屬性”和“對象名.方法名”的方式訪問類屬性和對應的方法,同時在主函數中修改屬性值。[例4-2]類的定義實例。4.3類定義與使用屬性044.4.1實例屬性和類屬性類屬性:在定義類中且在方法之外定義的屬性,是所有類的對象都具有的屬性。通常情況下,類屬性一般通過類名進行訪問,也可通過對象名進行類屬性的訪問,但一般不推薦,容易造成屬性值不一致的情況。同時可在主函數中直接修改屬性值或者直接添加屬性,如“Student”類中的“age”屬性。實例屬性:定義在構造函數__init__中的屬性,定義時以self為前綴。實例屬性是描述某一對象特征的數據,故而只專屬于對象的屬性,也只能通過對象名訪問,如Student_new類中的self.weight和self.height屬性。實例屬性的設置也比較靈活,可以在定義類中的__init__方法中設置,也可在主函數中直接添加修改。[例4-3]類的實例屬性與類屬性實例。(Student_new參照4-2)【分析】:類定義放在CLASS.py文件中,在本例中使用到其中的Studen_new類。創(chuàng)建對象時采用顯式定義的構造函數__init__,并通過“對象名.屬性”和“對象名.方法名”的方式訪問類屬性和對應的方法。同時在主函數中對已有的類屬性和實例屬性修改,并新增類屬性(sex)和實例屬性(score)。4.4.1實例屬性和類屬性在有時,類中的一些屬性不希望對外公開,因此屏蔽一些屬性值在實現功能時有較大意義。Python中默認的成員函數和成員變量都是公開的,其中的私有屬性和方法沒有類似Java中public、private等關鍵詞來修飾,所以僅以編程來實現區(qū)分。私有屬性:屬性名前有前綴“__”的屬性,一般情況下,只能在類的內部調用,但也可以在類外部以“實例名._類名__私有屬性名”的方式訪問。公有屬性:除私有屬性外,其余均為公有屬性。4.4.2公有屬性和私有屬性[例4-4]類的共有屬性和私有屬性實例?!痉治觥浚涸诒纠惺褂玫狡渲械腟tudent_private類。定義類中分別定義了私有屬性(__age和__weight)和公有屬性,并在方法中直接調用了私有屬性(__age屬性)。創(chuàng)建對象時采用顯式定義的構造函數__init__,并通過“對象名.屬性”和“對象名.方法名”的方式訪問公有的類屬性和對應的方法,但不適用于私有方法的訪問,否則會報錯。4.4.2公有屬性和私有屬性[例4-4]類的共有屬性和私有屬性實例。(以下是錯誤示范)4.4.2公有屬性和私有屬性用戶不能用wangwu.__weight方式訪問學生體重,然而用戶也就知道了__weight是個私有變量。我們有沒有一種方法讓用戶通過wangwu.weight來訪問學生分數同時繼續(xù)保持__weight私有變量的屬性呢?這時我們可以借助python的@property裝飾器。[例4-5]裝飾器實例。注意:一旦給函數加上裝飾器@property,調用函數的時候可以不加括號直接調用。4.4.2公有屬性和私有屬性方法054.5方法實例方法:在類中定義的,一般以self作為第一個參數,self代表調用這個方法的對象本身,相當于Java中this的效果,而在方法調用時,可以不用傳入self參數,Python會自動將調用這個方法的對象作為參數傳入,這也進一步說明實例方法只可以通過對象進行調用。在類定義中,可以通過self關鍵詞實現對象屬性的修改,當方法體中的屬性與類屬性同名時,會覆蓋類屬性的值。類方法:使用修飾器@classmethod修飾的方法,它的第一個參數是“cls”,表示類本身,作用如同self。類方法可以通過類名或對象名調用。靜態(tài)方法:是使用修飾器@staticmethod修飾的方法,該方法既不需要對象參數self,也不需要類參數cls,所以該方法沒有默認參數。在調用靜態(tài)方法時,可以通過類名或對象名來調用。4.5.1實例方法[例4-6]實例方法實例。【分析】:在本例中,類定義放在CLASS.py文件中,在本例中使用到其中的Cars類,Cars類中的類屬性與方法中的屬性同名(即“price”屬性),創(chuàng)建c1對象.從結果可以看出,在訪問Price_used()方法之前,使用c1對象訪問的price屬性值為100,說明訪問的是類屬性。在調用對象方法后,再使用c1對象訪問的price屬性值為80,此時訪問的是對象方法中的同名屬性。4.5.2類方法[例4-7]類方法實例?!痉治觥浚侯惗x放在CLASS.py文件中,在本例中使用到其中的Books類,類聲明中分別定義了實例方法(sell_one())和類方法(sell_two())。從前2個調用結果看,在調用實例方法(sell_one)后,類屬性的值沒發(fā)生改變,但調用類方法(sell_two)后,類的屬性值發(fā)生變化;對比后2個調用結果,可見類和對象都可調用類方法。4.5.3靜態(tài)方法[例4-8]靜態(tài)方法實例?!痉治觥浚簭倪\行結果來看,類和對象均可實現靜態(tài)方法的調用。繼承064.6類的繼承繼承是面向對象的一個重要特征,反映類與類之間的一種所屬關系,其中已經存在的定義類一般稱為“父類”,而將要在父類基礎上定義的類稱為“子類”。當子類具有與父類相同的屬性和方法時,不需要重復相同的代碼,只需直接定義新增的特征或方法。例如:在“學生”類的基礎上再定義新的子類“小學生”、“中學生”或“大學生”。這些子類完全擁有“學生”類的屬性和方法。如果父類中有私有屬性或方法時,子類不能繼承。繼承使用的語法格式為:class父類名:
方法體class子類名(父類名):
方法體注:子類定義中的父類名表示其繼承自哪一個父類,可以是簡單的單個類名,也可以是多個類名,還可以是復雜的表達式,只要值是類對象。當有多個類名時,中間以逗號“,”隔開,也表示子類繼承自多個父類,稱為多繼承。4.6.1隱形繼承1、隱性繼承是指子類完全繼承父類的全部屬性與方法,沒有在子類方法體中定義其他的屬性或方法,從而子類具有和父類一樣的特征與功能,但如果父類中含有私有屬性或方法時,子類并不能繼承?!痉治觥浚罕敬a定義一個Animal類,類中定義了屬性foot和eating()方法,并輸出一個字符串。然后又定義一個Bird類,繼承自Animal類,方法體中沒有新增任何其他方法或屬性。最后又創(chuàng)建了一個magpie對象,并訪問其foot屬性與eating()方法。[例4-9]隱性繼承實例。結論:子類對象不能直接訪問父類的私有屬性和私有方法。子類對象可以通過訪問父類方法從而間接訪問父類的私有屬性。[例4-10]子類對象訪問父類實例。4.6.1隱形繼承4.6.2覆蓋2、覆蓋
在子類與父類的繼承關系中,會出現子類方法名與父類方法名同名的情況,但其功能卻不一樣,在調用該方法時父類方法被完全覆蓋,即對象調用了子類中的同名方法。【分析】:初始化一個子類對象,調用born()方法,結果顯示執(zhí)行的是子類定義中的方法。[例4-11]覆蓋實例。4.6.3
super繼承3、super繼承:如果子類和父類有同名方法時,子類的方法會將父類方法覆蓋。而在實際需要中,我們有時需要調用父類的同名方法,這就需要用到super關鍵字。
super函數經常使用在子類構造函數__init__()的重寫上,其使用格式如下:
super().XXX()
注意:XXX()為方法名。這種形式不帶任何參數,其一般出現在子類方法的定義里,在調用這一方法時,解釋器會先找到這一對象的直接父類,再在父類中開始找尋XXX()方法,并執(zhí)行,然后再執(zhí)行所在子類方法?!痉治觥浚簃agpie對象要求調用born()方法,這一方法是指子類中的方法,其方法體中含有super().born(),所以解釋器從magpie所屬父類(Animal)開始查找born()方法,并執(zhí)行,之后解釋器才執(zhí)行子類的born()方法中的內容。4.6.3
super繼承[例4-12]super繼承實例。4、多重繼承是指子類不僅僅可以繼承一個父類,還可以繼承多個父類。例如:青蛙,既可以在陸地生活,也可以在水中生活。【分析】:首先申明是2個父類,其類的定義中均包含相同的屬性(foot)和方法(get_foot()),以及不同名的方法。子類Frog的定義中指明了屬性和方法繼承至哪個父類。主函數中分別訪問了兩個父類的方法及同名方法。結果顯示,Frog類的對象同時繼承了兩個父類的方法。4.6.4多重繼承[例4-12]super繼承實例。運算符重載074.7運算符重載Python中允許用戶使用一些特定的方法實現運算符重載,從而使類的實例對象支持Python的各種內置操作。方法說明運算符__add__(self,num)加法self+num__sub__(self,num)減法Self-num__mul__(self,num)乘法Self*num__mod__(self,num)取余Self%num__pow__(self,num)冪運算Self**num__truediv__(self,num)除法Self/num__radd__(self,num)加法num+self__iadd__(self,num)加法self+=num__and__(self,num)位與self&num__or__(self,num)位或self|num運算符重載方法(部分)4.7運算符重載[例4-14]運算符重載實例?!痉治觥浚罕纠卸x了一個Calculator類,并重載__add__()和__sub__()方法,初始化一個對象后,對其進行加減運算。本章實踐例題本章實踐例題[例4-15]定義父類SchoolMember,定義子類Teacher和Student,實現學校人員登記。本章實踐例題[例4-16]定義類Triangle,實現能根據輸入的三邊,計算三角形的周長和面積。本章實踐例題[例4-17]定義類Clock,實現數字時鐘計時。小結本章結合實例介紹了Python中面向對象編程的基礎內容,主要包括類的屬性與方法的介紹以及相關應用實例的分析,幫助理解面向對象的編程思想。需重點掌握的內
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 第一輪復習地球和地圖教案
- 《陋室銘》教學設計和教學反思
- 汽車制造廠供水工程合同
- 醫(yī)院培訓聘用合同
- 幼教場所空氣凈化改造合同
- 保健品行業(yè)零用金審批流程
- 機場免稅店保安員聘用合同
- 廣州旅游景點租賃合同樣本
- 登山器材租賃協(xié)議范本
- 煤礦通風工作票管理制度
- 菜籽油銷售方案
- 2022配電網對分布式光伏的接納能力分析
- 車站愛心驛站活動方案
- AE200H型號變頻器用戶手冊
- 智能交通系統(tǒng)中交通事故預防與安全預警
- 探索中小學人工智能課程的設計與實施
- 個人申報國家社科基金的過程與體會
- QtC++程序設計-教學大綱
- 《企業(yè)普法講座》課件
- 引領學生了解物理科學的前沿與進展
- 2024年國家能源集團公司招聘筆試參考題庫含答案解析
評論
0/150
提交評論