![第7章Python面向對象_第1頁](http://file4.renrendoc.com/view14/M00/31/32/wKhkGWYXzDeAJ2FdAAEDsLTINQ8197.jpg)
![第7章Python面向對象_第2頁](http://file4.renrendoc.com/view14/M00/31/32/wKhkGWYXzDeAJ2FdAAEDsLTINQ81972.jpg)
![第7章Python面向對象_第3頁](http://file4.renrendoc.com/view14/M00/31/32/wKhkGWYXzDeAJ2FdAAEDsLTINQ81973.jpg)
![第7章Python面向對象_第4頁](http://file4.renrendoc.com/view14/M00/31/32/wKhkGWYXzDeAJ2FdAAEDsLTINQ81974.jpg)
![第7章Python面向對象_第5頁](http://file4.renrendoc.com/view14/M00/31/32/wKhkGWYXzDeAJ2FdAAEDsLTINQ81975.jpg)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
學院系部名稱主講:授課教師姓名Python基礎教程第7章Python面向對象 Python從設計之初就已經是一門面向對象的語言,正因為如此,在Python中創(chuàng)建一個類和對象是很容易的。
如果以前沒有接觸過面向對象的編程語言,那可能需要先了解面向對象語言的一些基本特征,在頭腦里形成一個基本的面向對象的概念,這樣有助于學習Python的面向對象編程。本章的目標是了解并掌握Python面向對象技術。第7章Python面向對象【教學導航】學習目標1.了解Python面向對象技術2.了解并掌握Python類和對象的定義及使用3.了解并掌握Python類的繼承4.了解并掌握Python類的方法重寫與運算符重載5.掌握函數的嵌套調用教學重點Python類和對象的定義,類的繼承,類的方法重寫與運算符重載教學方式案例教學法、分組討論法、自主學習法、探究式訓練法課時建議6課時本章主要內容類的繼承面向對象編程簡介類和對象123類的方法重寫4實訓757.1面向對象編程簡介程序編寫有兩種方式:一種是面向過程的語言,典型的如C語言;一種是面向對象的語言,典型的如Java、C++、C#等語言。本節(jié)講解Python面向對象技術。[學習目標]1.了解面向對象技術2.能區(qū)分面向對象和面向過程兩種方法3.了解面向對象編程中類和對象的概念7.1面向對象編程簡介面向過程:根據業(yè)務邏輯從上到下編寫代碼。面向對象:將數據與函數綁定到一起,進行封裝,這樣能夠更快速地開發(fā)程序,減少重復代碼的重寫過程面向過程編程最易被初學者接受,其往往用一長段代碼來實現指定功能,開發(fā)過程的思路是將數據與函數按照執(zhí)行的邏輯順序組織在一起,數據與函數分開考慮。以我們去買計算機的操作為例,它有兩種方式可以選擇。7.1面向對象編程簡介1.第一種方式,自己全程操作(1)查找資料,確定需求和預算。(2)根據需求和預算選定計算機的品牌型號。(3)去市場找到各種店進行購買,不知道真假,只能隨便找一家。(4)在店里找業(yè)務員,業(yè)務員推薦了另外一款,配置更高價格更便宜。(5)砍價付款。(6)成交,把計算機帶回家(把計算機帶回家后,使用時發(fā)現各種問題)。7.1面向對象編程簡介2.第二種方式(1)找一個懂計算機的計算機高手。(2)給錢交易。面向對象和面向過程都是解決問題的一種思路而已。買計算機的第一種方式強調的是步驟、過程,每一步都是自己親自去實現的,這種解決問題的思路就叫做面向過程。
買計算機的第二種方式強調的是雇用計算機高手。計算機高手是處理這件事的主角,對我們而言,我們并不必親自實現整個步驟,只需要利用計算機高手就可以解決問題。這種解決問題的思路就是面向對象。用面向對象的思維解決問題的重點。當遇到一個需求的時候不用自己去實現,如果自己一步步實現那就是面向過程。這時應該找一個專門做這個事的人來做,這時候就是面向對象。面向對象是基于面向過程的。7.1面向對象編程簡介
面向對象編程(ObjectOrientedProgramming,OOP)也就是面向對象程序設計。按人們認識客觀世界的系統(tǒng)思維方式,采用基于對象(實體)的概念建立模型,模擬客觀世界分析、設計、實現軟件的辦法。這種方法把軟件系統(tǒng)中相近或相似的操作邏輯和操作應用數據、狀態(tài),以類的形式描述出來,以對象實例的形式在軟件系統(tǒng)中復用,以達到提高軟件開發(fā)效率的作用。
面向對象編程有2個非常重要的概念:類和對象。
現實世界中的任何事件都可以稱為對象,對象是構成世界的一個獨立單位,例如,能運送人或貨物的“運輸工具”有飛機、輪船、火車、卡車、轎車等,這些都是對象。
把眾多的事物歸納、劃分成一些類是人類在認識客觀世界經常采用的思維方法。
把具有共同性質的事物劃分為一類,得出一個抽象的概念。例如,汽車、車輛、運輸工具等都是一些抽象概念,它們是一些具有共同特征的事件的集合,被稱為類7.1面向對象編程簡介
在面向對象編程中,對象是面向對象編程的核心。在使用對象的過程中,和認識客觀事物一樣,為了將具有共同特征和行為的一組對象抽象定義,提出了類的概念。
類是抽象的,在使用的時候通常會找到這個類的一個具體的存在,然后再使用這個具體的存在。一個類可以有多個對象。類是用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例人類在設計事物時,主要包括以下3個方面?!袷挛锩Q:如人?!袷挛锏膶傩裕喝缛说纳砀?、體重、年齡等?!袷挛锏姆椒ǎㄐ袨?功能):如人學習、工作等。根據人類設計事物的特點,對類也作了定義。類由以下3個部分構成?!耦惖拿Q:類名。●類的屬性:一組靜態(tài)的數據。●類的方法:類能夠進行操作的方法(行為)7.2類和對象類是一種數據結構,是現實世界中實體的集合。在程序設計中以編程形式出現。本節(jié)介紹類的編程定義,講解類的創(chuàng)建[學習目標]1.了解并掌握類的創(chuàng)建2.了解并掌握實例對象及屬性訪問3.了解并掌握類的構造方法、析構方法及私有方法7.2.1類的創(chuàng)建
Python是面向對象的語言。對象在創(chuàng)建前,需要先定義一個類,然后通過類才能創(chuàng)建實例對象。在Python中,使用class語句來創(chuàng)建一個新類,class之后為類的名稱并以冒號結尾。類名使用駝峰(CamelCase)命名風格,首字母大寫,私有類可用一個下畫線開頭classClassName: '類的幫助信息'#類文檔字符串 class_suite#類體class_suite由類屬性、成員、方法組classStu: name="張三"print(S)7.2.1類的創(chuàng)建
定義一個Stu類,類里定義了name屬性,默認值為“張三”。該name就是類Stu的屬性,這種屬性是定義在類中的,也稱為類屬性。類屬性可以通過使用類名稱來讀取訪問,還可以使用類的實例對象進行訪問(在下一小節(jié)中進行介紹)。類屬性使用類名稱訪問,訪問方式如下:類名.屬性如上例中的S。類屬性是與類綁定的。如果要修改類的屬性,必須使用類名訪問它,此時不能使用對象實例訪問(通過對象實例訪問結果在7.3節(jié)中進行介紹),如例7-2-2所示。classStu: name="張三"print("name的初始值是:",S)S="李明"print("name的現值是:",S)7.2.1類的創(chuàng)建
在Python中,沒有public和private這些關鍵字來區(qū)別公有屬性和私有屬性。Python使用屬性命名方式來區(qū)分公有屬性和私有屬性。之前所定義的name屬性,是公有屬性,可以直接在類外面進行訪問。如果定義的屬性不想被外部訪問,則需要將它定義成私有的,私有屬性需在前面加兩個下畫線“__”。類的方法也一樣,方法前加了兩個下畫線符號表示私有,否則就表示公有。classStu: __name="張三"print("name的初始值是:",Stu.__name)程序運行報錯,提示找不到__name屬性。因為__name是私有屬性。私有屬性不能在類外通過對象名來進行訪問7.2.1類的創(chuàng)建在Python中,有一些特殊的屬性定義,主要是內置類屬性。內置類屬性包括以下幾種?!馹_dict__:類的屬性(包含一個字典,由類的數據屬性組成)。●__doc__:類的文檔字符串。●__name__:類名●__module__:類定義所在的模塊(類的全名是“__main__.className”,如果類位于一個導入模塊mymod中,那么className.__module__等于mymod)。●__bases__:類的所有父類構成元素(包含了由所有父類組成的元組)。7.2.2實例對象
程序想要完成具體的功能,僅有類是不夠的,需要根據類創(chuàng)建實例對象,通過實例對象完成具體的功能。
實例對象,就是為類創(chuàng)建一個具體的實例化的對象,以使用類的相關屬性和方法 Python中,創(chuàng)建類的實例化對象不需使用new,可以直接賦值,語法如下:
對象名=類名()創(chuàng)建一個類的實例,使用類的名稱,并通過__init__()方法接受參數classStu:#'定義一個屬性 name="張三“ age=19#創(chuàng)建Stu類的對象stu=Stu()print("學生姓名:%s,年齡:%d"%(,stu.age))7.2.3類的方法
在類的內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數。1.構造方法
構造方法__init__()是一種特殊的方法,被稱為類的構造函數或初始化方法,用來進行一些初始化的操作,在對象創(chuàng)建時就設置好屬性。如果用戶沒有重新定義構造函數,則系統(tǒng)自動執(zhí)行默認的構造方法。這個方法不需要顯式調用,當創(chuàng)建了這個類的實例時就會調用該方法
在構造方法__init__()中,init前后用兩個下畫線開頭和結尾,是Python內置的方法,用于在對象實例化時對實例進行的初始化工作。如,顯示一個姓名叫“張三”,學號是1號的學生,可以直接使用構造方法進行定義7.2.3類的方法例7-2-5類的構造方法實例。在該例子中,構造方法和自定義方法,都有參數self。所謂的self,可以理解為“自己”,如同C++中類里面的this指針一樣,就是對象自身的意思。在方法的定義中,第一個參數永遠是self。某個對象調用其方法時,Python解釋器會把這個對象作為第一個參數傳遞給self,所以開發(fā)者只需要傳遞后面的參數即可self僅僅是一個變量名,也可將self換為其他任意的名字,但是為了能夠讓其他開發(fā)人員能明白該變量的意思,因此一般都會把self當作名字。7.2.3類的方法在上例的構造方法中,直接給出了學生的姓名和學號。但實際上,對象的屬性需要動態(tài)添加,在對象創(chuàng)建完成時確定對象的屬性值。需要使用帶參數的構造方法,在構造方法中傳入參數設置屬性的值在上例中,empCount變量是一個類變量,它的值將在這個類的所有實例之間共享。在內部類或外部類使用“類名.屬性”(Stu.empCount)訪問。7.2.3類的方法__init__()方法,在創(chuàng)建一個對象時默認被調用,不需要手動調用。默認有1個參數名字為self,如果在創(chuàng)建對象時傳遞了2個實參,那么__init__(self)中除了self作為第一個形參外還需要2個形參,例如__init__(self,name,stuid)。__init__(self)中的self參數,不需要開發(fā)者傳遞,Python解釋器會自動把當前的對象引用傳遞進去。 2.析構方法__init__()方法是析構方法,當創(chuàng)建對象后,Python解釋器會調用__init__()方法。當刪除一個對象來釋放類所占用的資源時,Python解釋器會調用另外一個方法,也就是析構方法。
析構方法__del__(),使用del命令,前后同樣用兩個下畫線開頭和結尾。該方法同樣不需要顯式調用,在釋放對象時進行調用,可以進行釋放資源的操作7.2.3類的方法上例中,執(zhí)行到delstu語句時,此時刪除stu對象因此觸發(fā)析構方法,顯示“已釋放資源”。但如果不執(zhí)行delstu語句,換成del語句,則不會顯示“已釋放資源”,表明沒有執(zhí)行析構方法,因為此時stu對象存在,只不過stu的name屬性被刪除了。析構方法必須是整個實例對象已被刪除才能觸發(fā)。】7.2.3類的方法3.封裝
面向對象編程的特性是封裝、繼承與多態(tài)。封裝是隱藏屬性、方法與方法實現細節(jié)的過程。封裝是在變量或方法名前加兩個下畫線,封裝后,私有的變量或方法只能在定義它們的類內部調用,在類外和子類中不能直接調用封裝的語法如下:私有變量:__變量名私有方法:__方法名()通過設置私有變量或私有方法,實現封裝,在變量名或方法名前加上“__”(兩個下畫線)。私有變量,可以避免外界對其隨意賦值,保護類中的變量;私有方法,不允許從外部調用。對私有變量可以添加供外界調用的變通方法,用于修改或讀取變量的值。私有方法和私有變量的操作7.2.3類的方法Python不允許實例化的類訪問私有數據,所以上例中最后一行代碼報錯。如果需要訪問私有屬性,可用object._className__attrName訪問屬性,將如下代碼替換以上代碼的最后一行代碼 print(counter._JustCounter__secretCount)#coding=utf-8classJustCounter: __secretCount=0#私有變量
publicCount=0#公開變量 defcount(self): self.__secretCount+=1 self.publicCount+=1 print(self.__secretCount)counter=JustCounter()counter.count()counter.count()print(counter.publicCount)print(counter.__secretCount)#報錯,實例不能訪問私有變量//print(counter._JustCounter__secretCount)7.3類的繼承繼承是面向對象的編程的三大特性之一,繼承可以解決編程中的代碼冗余問題,是實現代碼重用的重要手段。本節(jié)的目標是了解并掌握類的繼承。[學習目標]1.了解繼承的特點2.了解并掌握Python類的繼承3.了解并掌握子類屬性及方法定義7.3類的繼承
面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制實現的。繼承完全可以理解成類之間的類型和子類型關系。
類的繼承是指在一個現有類的基礎上,構建一個新的類。構建的新類能自動擁有原有類的屬性和方法。構建出來的新類叫子類,原有類稱為父類。也可以理解成類之間的類型和子類型關系。
繼承的語法格式如下: class子類名(父類名):如現有一個類,類名為A,定義如下:classA(object):現要定義類B繼承類A,將B類當作A類的子類,則B類定義如下: classB(A):需要注意的是:繼承語法“class子類名(父類名):”也可寫成“class派生類名(基類名):”,其中,父類名寫在括號中,父類是在類定義時,在元組之中指明的7.3類的繼承
在Python中繼承具有如下一些特點:
●在繼承中父類的構造(__init__()方法)不會被自動調用,它需要在其子類的構造中親自專門調用。
●在調用父類的方法時,需要加上父類的類名前綴,且需要帶上self參數變量,以區(qū)別于在類中調用普通函數時并不需要帶上self參數。
●Python總是首先查找對應類型的方法,如果它不能在子類中找到對應的方法,它才到父類中逐個查找(先在本類中查找調用的方法,找不到才到父類中找)
如果在繼承元組中列了一個以上的類,那么它就被稱為“多重繼承”。子類的聲明,與它們的父類類似,繼承的父類列表跟在類名之后,其語法為: class類名(父類名1[,父類名2,...]):
子類中語句7.3類的繼承繼承多個類操作示意如下:classA:#定義類A.....classB:#定義類B.....classC(A,B):#繼承類A和B7.3類的繼承可以使用issubclass()或者isinstance()方法來檢測是否是子類,方法如下 ●issubclass()布爾函數用于判斷一個類是另一個類的子類或者子孫類,其語法為:issubclass(sub,sup)。 ●isinstance(obj,Class)布爾函數,如果obj是Class類的實例對象或者是一個Class子類的實例對象則返回True。7.4類的方法重寫面向對象編程三大特性是封裝、繼承和多態(tài)。實現多態(tài)的技術基礎除了繼承,還有方法重寫。本節(jié)的目標是了解并掌握方法重寫與運算符重載。[學習目標]1.了解并掌握方法重寫2.了解類的功能方法3.了解并掌握運算符的重載4.了解常見運算符重載方法7.4.1方法重寫
面向對象編程三大特性中的最后一個特性是多態(tài)。多態(tài)的含義是指能夠呈現多種不同的形式或形態(tài)。在編程術語中,它的意思是一個變量可以引用不同類型的對象,并能自動調用被引用對象的方法,從而根據不同的對象類型響應不同的操作。繼承和方法重寫是實現多態(tài)的技術基礎。如果父類方法的功能不能滿足需求,可以在子類重寫父類的方法,此時執(zhí)行子類的方法,不再執(zhí)行父類的方法#coding=utf-8classParent:#定義父類 defmyMethod(self): print('調用父類方法’)classChild(Parent):#定義子類 defmyMethod(self): print('調用子類方法’)c=Child()#子類實例c.myMethod()#子類調用重寫方法7.4.1方法重寫
表7-4-1類的功能方法一覽表序號方法,描述&簡單的調用1__init__(self[,args...])構造函數簡單的調用方法:obj=className(args)2__del__(self)析構方法,刪除一個對象簡單的調用方法:dellobj3__repr__(self)轉化為供解釋器讀取的形式簡單的調用方法:repr(obj)4__str__(self)用于將值轉化為適于人閱讀的形式簡單的調用方法:str(obj)5__cmp__(self,x)對象比較簡單的調用方法:cmp(obj,x)7.4.2運算符重載Python語言提供了運算符重載功能,增強了語言的靈活性,這一點與C++有點類似但又有些不同。Python運算符重載就是通過重寫這些Python內置方法來實現的。這些方法都是以雙下畫線開頭和結尾的,類似于__X__的形式,Python通過這種特殊的命名方式來實現重載。當Python的內置操作運用于類對象時,Python會去搜索并調用對象中指定的方法完成操作。類可以重載加減運算、打印、函數調用、索引等內置運算,運算符重載使我們的對象的行為與內置對象的一樣。Python在調用操作符時會自動調用這樣的方法。常見運算符重載方法如表7-4-2所示。
7.4.1方法重寫
表7-4-2常見運算符重載方法方法說明調用__init__構造函數對象創(chuàng)建:X=Class(args)__del__析構函數X對象收回__add__云算法+如果沒有_iadd_,X+Y,X+=Y__or__運算符|如果沒有_ior_,X|Y,X|=Y_repr__,__str__打印,轉換print(X),repr(X),str(X)__call__函數調用X(*args,**kwargs)__getattr__點號運算X.undefined7.4.1方法重寫
續(xù)表7-4-2常見運算符重載方法方法說明調用__setattr__屬性賦值語句X.any=value__delattr__屬性刪除delX.any__getattribute__屬性獲取X.any__getitem__索引運算X[key],X[i:j__setitem__索引賦值語句X[key],X[i:j]=sequence__delitem__索引和分片刪除delX[key],delX[i:j]__len__長度len(X),如果沒有__bool__,真值測試7.4.1方法重寫
續(xù)表7-4-2常見運算符重載方法方法說明調用__bool__布爾測試bool(X)__lt__,__gt__,__le__,__ge__,__eq__,__ne__特定的比較X<Y,X>Y,X<=Y,X>=Y,X==Y,X!=Y注釋:(lt:lessthan,gt:greaterthan,le:lessequal,ge:greaterequal,eq:equal,ne:notequal)__radd__右側加法other+X__iadd__實地(增強的)加法X+=Y(orelse__add__)__iter__,__next__迭代環(huán)境I=iter(X),next()__contains__成員關系測試iteminX(任何可迭代)7.4.1方法重寫
續(xù)表7-4-2常見運算符重載方法方法說明調用__index__整數值hex(X),bin(X),oct(X)__enter__,__exit__環(huán)境管理器withobjasvar:__get__,__set__,__delete__描述符屬性X.attr,X.attr=value,delX.attr__new__創(chuàng)建在__init__之前創(chuàng)建對象7.4.1方法重寫
例如,如果類實現了__add__方法,當類的對象出現在+運算符中時
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年互聯(lián)網電路租賃合同(三篇)
- 2025年個人租房合租合同常用版(4篇)
- 保齡球館裝修合同范本
- 主題餐廳裝修免租合同
- 專賣店吊頂裝修合同
- 機場建設渣土運輸協(xié)議范本
- 遼寧雕花板崗亭施工方案
- 臨時承接合同范本
- 偽造員工勞動合同范本案例
- 基金托管合同范例
- JJG 921-2021環(huán)境振動分析儀
- GB/T 308.1-2013滾動軸承球第1部分:鋼球
- 中藥炮制學-第五、六章
- 中國風軍令狀誓師大會PPT模板
- 小兒高熱驚厥精品課件
- 2023機械工程師考試試題及答案
- 2022年電拖實驗報告伍宏淳
- 豐田汽車戰(zhàn)略規(guī)劃與戰(zhàn)略管理體系研究(2021)
- 公共政策學(第三版)-課件
- 冷卻塔是利用水和空氣的接觸
- 我的家鄉(xiāng)--安徽亳州.PPT
評論
0/150
提交評論