Python編程從入門到實(shí)戰(zhàn)-輕松過(guò)二級(jí) (思政版)(第2版) 課件 Ch09 面向?qū)ο蟮某绦蛟O(shè)計(jì)基礎(chǔ)_第1頁(yè)
Python編程從入門到實(shí)戰(zhàn)-輕松過(guò)二級(jí) (思政版)(第2版) 課件 Ch09 面向?qū)ο蟮某绦蛟O(shè)計(jì)基礎(chǔ)_第2頁(yè)
Python編程從入門到實(shí)戰(zhàn)-輕松過(guò)二級(jí) (思政版)(第2版) 課件 Ch09 面向?qū)ο蟮某绦蛟O(shè)計(jì)基礎(chǔ)_第3頁(yè)
Python編程從入門到實(shí)戰(zhàn)-輕松過(guò)二級(jí) (思政版)(第2版) 課件 Ch09 面向?qū)ο蟮某绦蛟O(shè)計(jì)基礎(chǔ)_第4頁(yè)
Python編程從入門到實(shí)戰(zhàn)-輕松過(guò)二級(jí) (思政版)(第2版) 課件 Ch09 面向?qū)ο蟮某绦蛟O(shè)計(jì)基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩23頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第二版本章要點(diǎn):第9章面向?qū)ο蟮某绦蛟O(shè)計(jì)基礎(chǔ)面向?qū)ο蟮母拍铑悓?duì)象和實(shí)例對(duì)象屬性方法對(duì)象的特殊方法繼承應(yīng)用舉例9.1面向?qū)ο蟾拍罘庋b、繼承和多態(tài)對(duì)象的定義某種事物的抽象(功能)抽象原則包括數(shù)據(jù)抽象和過(guò)程抽象兩個(gè)方面數(shù)據(jù)抽象-定義對(duì)象屬性;過(guò)程抽象-定義對(duì)象操作把客觀事物抽象并封裝成對(duì)象允許使用現(xiàn)有類的功能,并在無(wú)需重新改寫原來(lái)的類的情況下,對(duì)這些功能進(jìn)行擴(kuò)展封裝繼承多態(tài)性:對(duì)象可以表示多個(gè)類型的能力9.2類對(duì)象和實(shí)例對(duì)象類與對(duì)象的關(guān)系~車型設(shè)計(jì)和具體的車類的聲明【例9.1】定義類Person1(Person1.py)classPerson1:#定義類Person1

pass#類體為空語(yǔ)句

#測(cè)試代碼

p1=Person1()#創(chuàng)建和使用類對(duì)象

print(Person1,type(Person1),id(Person1))

print(p1,type(p1),id(p1))對(duì)象的創(chuàng)建和使用【例9.2】實(shí)例對(duì)象的創(chuàng)建和使用示例>>>c1=complex(1,2)>>>c1.conjugate()#輸出:(1-2j)(1-2j)>>>c1.real#輸出:1.01.09.3屬性類中定義的成員變量實(shí)例屬性通過(guò)self.變量名定義的屬性【例9.3】定義類Person2。定義成員變量(域)classPerson2:#定義類Person2

def__init__(self,name,age):#__init__方法=name

#初始化,即成員變量name(域)self.age=age#初始化self.age,即成員變量age(域)

defsay_hi(self):#定義類Person2的函數(shù)say_hi()print('您好,我叫',)#在實(shí)例方法中通過(guò)讀取成員變量name(域)#測(cè)試代碼p1=Person2('張三',25)#創(chuàng)建對(duì)象p1.say_hi()#調(diào)用對(duì)象的方法print(p1.age)#通過(guò)p1.age(obj1.變量名)讀取成員變量

age(域)屬性(2)類屬性:類本身的變量【例9.4】定義類Person3。定義類域和類方法邏輯思維:以推理和演繹為特征,以數(shù)學(xué)學(xué)科為代表實(shí)驗(yàn)思維:以實(shí)驗(yàn)和驗(yàn)證為特征,以物理學(xué)科為代表計(jì)算思維:以設(shè)計(jì)和構(gòu)造為特征,以計(jì)算機(jī)學(xué)科為代表classPerson3:count=0#定義屬性count,表示計(jì)數(shù)

name="Person"#定義屬性name,表示名稱#測(cè)試代碼Person3.count+=1#通過(guò)類名訪問(wèn),將計(jì)數(shù)加1print(Person3.count)#類名訪問(wèn),讀取并顯示類屬性print(P)#類名訪問(wèn),讀取并顯示類屬性p1=Person3()#創(chuàng)建實(shí)例對(duì)象1p2=Person3()#創(chuàng)建實(shí)例對(duì)象2print((,))#通過(guò)實(shí)例對(duì)象訪問(wèn),讀取成員變量的值P="雇員"#通過(guò)類名訪問(wèn),設(shè)置類屬性值print((,))#讀取成員變量的值="員工"#通過(guò)實(shí)例對(duì)象訪問(wèn),設(shè)置實(shí)例對(duì)象成員變量的值print((,))#讀取成員變量的值私有屬性和公有屬性classA:__name='classA'#私有類屬性

defget_name():print(A.__name)#在類方法中訪問(wèn)私有類屬性#測(cè)試代碼A.get_name()A.__name#導(dǎo)致錯(cuò)誤,不能直接訪問(wèn)私有類屬性兩個(gè)下劃線開頭,但是不以兩個(gè)下劃線結(jié)束的屬性是私有的(private),其他為公共的(public)【例9.5】私有屬性示例(private.py)特殊屬性特殊屬性(SpecialAttributes)Python對(duì)象中包含許多以雙下畫線開始和結(jié)束的方法,稱之為特殊屬性【例9.6】探索對(duì)象的特殊屬性>>>i=123#聲明一個(gè)整型對(duì)象>>>dir(i)#顯示對(duì)象i的所有成員>>>i.__class__#特殊屬性__class__,返回其所屬的類。輸出:<class'int'>9.4方法【例9.7】實(shí)例方法示例。定義類Person4,創(chuàng)建其對(duì)象,并調(diào)用對(duì)象函數(shù)0102classPerson4:#定義類Person4defsay_hi(self,name):#定義方法say_hi=name#把參數(shù)name賦值給,即成員變量name(域)print('您好,我叫',)p4=Person4()#創(chuàng)建對(duì)象實(shí)例p4.say_hi('Alice')#調(diào)用對(duì)象實(shí)例的方法__init__方法(構(gòu)造函數(shù))【例9.8】__init__方法示例(PersonInit.py)__init__方法即構(gòu)造函數(shù)(構(gòu)造方法),用于執(zhí)行類的實(shí)例的初始化工作。創(chuàng)建完對(duì)象后調(diào)用,初始化當(dāng)前對(duì)象的實(shí)例,無(wú)返回值classPerson5:#定義類Person5def__init__(self,name):#__init__方法=name#把參數(shù)name賦值給,即成員變量name(域)defsay_hi(self):#定義類Person的方法say_hiprint('您好,我叫',)p5=Person5('Helen')#創(chuàng)建對(duì)象p5.say_hi()#調(diào)用對(duì)象的方法私有方法與公有方法兩個(gè)下劃線開頭,但不以兩個(gè)下劃線結(jié)束的方法是私有的(private),其他為公共的(public)以雙下劃線開始和結(jié)束的方法是Python的專有特殊方法。不能直接訪問(wèn)私有方法,但可以在其他方法中訪問(wèn)【例9.9】私有方法示例classBook:#定義類Bookdef__init__(self,name,author,price):=name#把參數(shù)name賦值給,即成員變量name(域)

self.author=author#把參數(shù)author賦值給self.author,即成員變量author(域)

self.price=price#把參數(shù)price賦值給self.price,即成員變量price(域)

def__check_name(self):#定義私有方法,判斷name是否為空

if=='':returnFalseelse:returnTruedefget_name(self):#定義類Book的方法get_nameifself.__check_name():print(,self.author)#調(diào)用私有方法

else:print('Novalue')b=Book('Python程序設(shè)計(jì)教程','江紅',59.0)#創(chuàng)建對(duì)象b.get_name()#調(diào)用對(duì)象的方法b.__check_name()#直接調(diào)用私有方法,非法方法重載classPerson21:#定義類Person21defsay_hi(self,name=None):#定義類方say_hi=name#把參數(shù)name賦值給#,即成員變量name(域)

ifname==None:print('您好!')else:print('您好,我叫',)p21=Person21()#創(chuàng)建對(duì)象p21.say_hi()#調(diào)用對(duì)象的方法,無(wú)參數(shù)p21.say_hi('威爾遜')#調(diào)用對(duì)象的方法,帶參數(shù)可以定義多個(gè)重名的方法,只要保證方法簽名是唯一的方法簽名包括三個(gè)部分:方法名、參數(shù)數(shù)量和參數(shù)類型【例9.10】方法重載示例(Person21Overload.py)0102【例9.11】方法重載示例2classPerson22:#定義類Person22defsay_hi(self,name):#定義類方法say_hi,帶兩個(gè)參數(shù)

print('您好,我叫',)defsay_hi(self,name,age):#定義類方法say_hi,帶三個(gè)參數(shù)

print('hi,{0},年齡:{1}'.format(name,age))p22=Person22()#創(chuàng)建對(duì)象p22.say_hi('Lisa',22)#調(diào)用對(duì)象的方法#p22.say_hi('Bob')#TypeError:say_hi()missing1requiredpositionalargument:'age'9.5對(duì)象的特殊方法包含許多以雙下劃線開始和結(jié)束的方法,稱之為特殊方法例如,創(chuàng)建對(duì)象實(shí)例時(shí)自動(dòng)調(diào)用其__init__方法。執(zhí)行a<b時(shí),自動(dòng)調(diào)用對(duì)象a的__lt__方法表9-1Python特殊方法【例9.12】對(duì)象的特殊方法示例classPerson:def__init__(self,name,age):#特殊方法(構(gòu)造函數(shù))

=nameself.age=agedef__str__(self):#特殊方法,輸出成員變量

return'{0},{1}'.format(,self.age)#測(cè)試代碼p1=Person('張三',23)print(p1)Python的運(yùn)算符實(shí)際上是通過(guò)調(diào)用對(duì)象的特殊方法實(shí)現(xiàn)的運(yùn)算符重載與對(duì)象的特殊方法>>>x=12;y=23>>>x+y#等價(jià)于調(diào)用x.__add__(y)。輸出:3535>>>x.__add__(y)#輸出:3535【例9.13】運(yùn)算符重載示例classMyList:#定義類MyListdef__init__(self,*args):#構(gòu)造函數(shù)

self.__mylist=[]#初始化私有屬性,空列表

forarginargs:self.__mylist.append(arg)def__add__(self,n):#重載運(yùn)算符"+",每個(gè)元素增加nforiinrange(0,len(self.__mylist)):self.__mylist[i]+=ndef__sub__(self,n):#重載運(yùn)算符"-",每個(gè)元素減少nforiinrange(0,len(self.__mylist)):self.__mylist[i]-=ndef__mul__(self,n):#重載運(yùn)算符"*",每個(gè)元素乘以nforiinrange(0,len(self.__mylist)):self.__mylist[i]*=ndef__truediv__(self,n):#重載運(yùn)算符"/",每個(gè)元素除以nforiinrange(0,len(self.__mylist)):self.__mylist[i]/=ndef__len__(self):#對(duì)應(yīng)于內(nèi)置函數(shù)len(),返回列表長(zhǎng)度

return(len(self.__mylist))def__repr__(self):#對(duì)應(yīng)于內(nèi)置函數(shù)str(),顯示列表

str1=''foriinrange(0,len(self.__mylist)):str1+=str(self.__mylist[i])+''returnstr1#測(cè)試代碼m=MyList(1,2,3,4,5)#創(chuàng)建對(duì)象m+2;print(repr(m))#每個(gè)元素加2m-1;print(repr(m))#每個(gè)元素減1m*4;print(repr(m))#每個(gè)元素乘4m/2;print(repr(m))#每個(gè)元素除2print(len(m))#列表長(zhǎng)度9.6繼承派生類:Python支持多重繼承,即一個(gè)派生類可以繼承多個(gè)基類聲明派生類時(shí),必須在其構(gòu)造函數(shù)中調(diào)用基類的構(gòu)造函數(shù)0102【例9.14】派生類示例創(chuàng)建基類Person,包含兩個(gè)數(shù)據(jù)成員name和age;創(chuàng)建派生類Student,包含一個(gè)數(shù)據(jù)成員stu_idclassPerson:#基類def__init__(self,name,age):#構(gòu)造函數(shù)=name#姓名self.age=age#年齡defsay_hi(self):#定義基類方法say_hiprint('您好,我叫{0},{1}歲'.format(,self.age))classStudent(Person):#派生類def__init__(self,name,age,stu_id):#構(gòu)造函數(shù)Person.__init__(self,name,age)#調(diào)用基類構(gòu)造函數(shù)self.stu_id=stu_id#學(xué)號(hào)defsay_hi(self):#定義派生類方法say_hiPerson.say_hi(self)#調(diào)用基類方法say_hiprint('我是學(xué)生,我的學(xué)號(hào)為:',self.stu_id)p1=Person('張王一',33)#創(chuàng)建對(duì)象p1.say_hi()s1=Student('李姚二',20,‘2021101001')#創(chuàng)建對(duì)象s1.say_hi()類成員的繼承和重寫通過(guò)繼承,派生類繼承基類中除構(gòu)造方法之外的所有成員如果在派生類中重新定義從基類繼承的方法,則派生類中定義的方法覆蓋從基類中繼承的方法【例9.15】類成員的繼承和重寫示例classDimension:#定義類Dimensionsdef__init__(self,x,y):#構(gòu)造函數(shù)self.x=x#x坐標(biāo)self.y=y#y坐標(biāo)defarea(self):#基類的方法area()passclassCircle(Dimension):#定義類Circle(圓)def__init__(self,r):#構(gòu)造函數(shù)Dimension.__init__(self,r,0)defarea(self):#覆蓋基類的方法area()return3.14*self.x*self.x#計(jì)算圓面積classRectangle(Dimension):#定義類Rectangle(矩形)def__init__(self,w,h):#構(gòu)造函數(shù)Dimension.__init__(self,w,h)defarea(self):#覆蓋基類的方法area()returnself.x*self.y#計(jì)算矩形面積d1=Circle(2.0)#創(chuàng)建對(duì)象:圓d2=Rectangle(2.0,4.0)#創(chuàng)建對(duì)象:矩形print(d1.area(),d2.area())#計(jì)算并打印圓和矩形面積9.7應(yīng)用舉例:自定義類應(yīng)用舉例顏色(Color)——Color類封裝使用RGB顏色模型表示顏色及相應(yīng)功能。Color類的設(shè)計(jì)思路如下:(1)定義帶三個(gè)0到255的整數(shù)參數(shù)r、g、b的構(gòu)造函數(shù),用于初始化對(duì)應(yīng)于紅、綠、藍(lán)三種顏色分量的實(shí)例對(duì)象屬性_r、_g和_b(2)通過(guò)裝飾器@property定義三個(gè)可以作為屬性訪問(wèn)的實(shí)例對(duì)象方法r()、g()和b()(3)定義用于計(jì)算顏色亮度的方法luminance(self):Y=0.299r+0.587g+0.114b(4)定義用于轉(zhuǎn)換為灰度顏色亮度的方法toGray(self)(5)定義用于比較兩種顏色兼容性的方法isCompatible(self,c)。顏色兼容性指在以一種顏色為背景時(shí)另一種顏色的可閱讀性。一般而言,前景色和背景色的亮度差至少應(yīng)該是128。例如,白紙黑字的亮度差為255【例9.16】實(shí)現(xiàn)RGB顏色模型的Color類(color.py)classColor:"""表示RGB模型的類"""def__init__(self,r=0,g=0,b=0):"""構(gòu)造函數(shù)"""self._r=r#Red紅色分量

self._g=g#Green綠色分量

self._b=b#Blue藍(lán)色分量

@propertydefr(self):returnself._r@propertydefg(self):returnself._g@propertydefb(self):returnself._bdefluminance(self):"""計(jì)算并返回顏色的亮度"""return.299*self._r+.587*self._g+.114*self._bdeftoGray(self):"""轉(zhuǎn)換為灰度顏色"""y=int(round(self.luminance()))returnColor(y,y,y)defisCompatible(self,c):"""比較前景色和背景色是否匹配"""returnabs(self.luminance()-c.luminance())>=128.0def__str__(self):"""重載方法,輸出:(r,g,b)"""return'({},{},{})'.format(self._r,self._g,self._b)#常用顏色WHITE=Color(255,255,255)BLACK=Color(0,0,0)RED=Color(255,0,0)GREEN=Color(0,255,0)BLUE=Color(0,0,255)CYAN=Color(0,255,255)MAGENTA=Color(255,0,255)YELLOW=Color(255,255,0)#測(cè)試代碼if__name__=='__main__':c=Color(255,200,0)#ORANGE(橙色)print('顏色字符串:{}'.format(c))#輸出顏色字符串print(‘顏色分量:r={},g={},b={}’.format(c.r,c.g,c.b))#輸出各顏色分量print('顏色亮度:{}'.format(c.luminance()))#輸出顏色亮度print('轉(zhuǎn)換為幅度顏色:{}'.format(c.toGray()))#輸出轉(zhuǎn)換后的灰度顏色print('{}和{}是否匹配:{}'.format(c,RED,c.isCompatible(RED)))#比較與紅色是否匹配直方圖(Histogram)importrandomimportmathclassStat:def__init__(self,n):self._data=[]foriinrange(n):

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論