Python基礎(chǔ)與大數(shù)據(jù)應(yīng)用(第2版)(微課版)課件 單元4-面向?qū)ο缶幊袒A(chǔ)_第1頁(yè)
Python基礎(chǔ)與大數(shù)據(jù)應(yīng)用(第2版)(微課版)課件 單元4-面向?qū)ο缶幊袒A(chǔ)_第2頁(yè)
Python基礎(chǔ)與大數(shù)據(jù)應(yīng)用(第2版)(微課版)課件 單元4-面向?qū)ο缶幊袒A(chǔ)_第3頁(yè)
Python基礎(chǔ)與大數(shù)據(jù)應(yīng)用(第2版)(微課版)課件 單元4-面向?qū)ο缶幊袒A(chǔ)_第4頁(yè)
Python基礎(chǔ)與大數(shù)據(jù)應(yīng)用(第2版)(微課版)課件 單元4-面向?qū)ο缶幊袒A(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩27頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

單元四

面向?qū)ο缶幊袒A(chǔ)3屬性與方法目錄繼承2類(lèi)和對(duì)象1多態(tài)4項(xiàng)目實(shí)戰(zhàn)5單元小結(jié)6類(lèi)和對(duì)象3

面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP)是一種程序設(shè)計(jì)思想,能夠很好地支持代碼復(fù)用和設(shè)計(jì)復(fù)用。面向?qū)ο缶幊贪褜?duì)象作為程序的基本單元,就是把對(duì)象包含數(shù)據(jù)和操作數(shù)據(jù)的方法封裝在一起,組成一個(gè)相互依存、不可分割的整體。通過(guò)對(duì)對(duì)象進(jìn)行分類(lèi)、抽象后,將所具有的共同特征定義為類(lèi)。面象對(duì)象程序設(shè)計(jì)的關(guān)鍵是如何合理地定義和組織這些類(lèi)以及類(lèi)之間的關(guān)系。Python完全采用面向?qū)ο蟪绦蛟O(shè)計(jì)的思想,是真正面向?qū)ο蟮母呒?jí)動(dòng)態(tài)編程語(yǔ)言,完全支持面向?qū)ο蟮姆庋b、繼承、多態(tài)以及對(duì)基類(lèi)方法的覆蓋或重寫(xiě)等基本功能。在Python中,所有數(shù)據(jù)類(lèi)型都被視為對(duì)象,如字符串、列表、字典、元組等內(nèi)置數(shù)據(jù)類(lèi)型都具有和對(duì)象完全相似的語(yǔ)法和用法。

類(lèi)是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。類(lèi)是對(duì)象的模板,用于創(chuàng)建對(duì)象;對(duì)象是類(lèi)的實(shí)例,通過(guò)類(lèi)的構(gòu)造函數(shù)產(chǎn)生。類(lèi)和對(duì)象41.類(lèi)

類(lèi)的定義:類(lèi)是對(duì)一類(lèi)具有共同特征事物的抽象。Python中,類(lèi)定義的一般格式如下:class類(lèi)名:

類(lèi)體>>>classCar:#定義汽車(chē)類(lèi),類(lèi)名稱(chēng):Car

name='passat'#定義類(lèi)屬性:name,值為'passat'

price='190000'#定義類(lèi)屬性:price,值為'190000'

defdrive(self):

#定義類(lèi)方法,方法名稱(chēng):drive

print('Icanrun.')

當(dāng)定義了一個(gè)類(lèi)以后就產(chǎn)生了一個(gè)類(lèi)對(duì)象。類(lèi)對(duì)象可以進(jìn)行兩種操作:一種是引用,即通過(guò)類(lèi)本身這個(gè)對(duì)象來(lái)引用(訪(fǎng)問(wèn))類(lèi)中的屬性或方法,如C,Car.price,Car.Drive;另外一種是實(shí)例化,即通過(guò)類(lèi)來(lái)產(chǎn)生一個(gè)具體的實(shí)例對(duì)象,然后通過(guò)實(shí)例對(duì)象來(lái)訪(fǎng)問(wèn)類(lèi)中定義的屬性或方法。類(lèi)和對(duì)象52.對(duì)象類(lèi)對(duì)象雖然可以直接使用,但有一些限制。更多時(shí)候是將類(lèi)實(shí)例化,即創(chuàng)建實(shí)例對(duì)象,通過(guò)實(shí)例對(duì)象來(lái)訪(fǎng)問(wèn)類(lèi)的屬性和方法。實(shí)例對(duì)象創(chuàng)建和使用的一般格式:實(shí)例對(duì)象名=類(lèi)名([參數(shù)列表])#通過(guò)類(lèi)名來(lái)實(shí)例化對(duì)象實(shí)例對(duì)象創(chuàng)建后,就可以使用“.”運(yùn)算符來(lái)訪(fǎng)問(wèn)這個(gè)實(shí)例對(duì)象原自類(lèi)的屬性和方法。即:實(shí)例對(duì)象名.屬性名

實(shí)例對(duì)象名.函數(shù)名()例如利用定義的汽車(chē)類(lèi)Car創(chuàng)建一個(gè)汽車(chē)實(shí)例對(duì)象car1如下:>>>car1=Car()#利用定義的汽車(chē)類(lèi)Car創(chuàng)建一個(gè)汽車(chē)實(shí)例對(duì)象car1>>>#訪(fǎng)問(wèn)對(duì)象的屬性'passat'>>>='ford'

#給對(duì)象car1的name屬性賦值'ford'>>>car1.price='180000'#給對(duì)象car1的price屬性賦值'180000'>>>#查看的值'ford'>>>car1.price#查看car1.price的值'180000'>>>car1.drive()

#訪(fǎng)問(wèn)car1的方法Icanrun.以后如果不特別說(shuō)明,對(duì)象一般指實(shí)例對(duì)象。實(shí)例對(duì)象有時(shí)候又簡(jiǎn)稱(chēng)實(shí)例。3屬性與方法目錄繼承2類(lèi)和對(duì)象1多態(tài)4項(xiàng)目實(shí)戰(zhàn)5單元小結(jié)6屬性與方法71.屬性類(lèi)屬性:類(lèi)屬性就是類(lèi)(即類(lèi)對(duì)象)中所定義的屬性,有公有的和私有的類(lèi)屬性?xún)煞N。>>>classCar:#定義汽車(chē)類(lèi),類(lèi)名稱(chēng):Car

name='passat'#定義公有的類(lèi)屬性:name,值='passat'

__color='red'#定義私有的類(lèi)屬性:__color,值='red’>>>car1=Car()#創(chuàng)建一個(gè)汽車(chē)對(duì)象car1>>>#通過(guò)類(lèi)的實(shí)例car1訪(fǎng)問(wèn)公有的類(lèi)屬性:name'passat'>>>C#通過(guò)類(lèi)對(duì)象Car訪(fǎng)問(wèn)公有的類(lèi)屬性:name'passat'

>>>car1.__color#通過(guò)實(shí)例對(duì)象car1訪(fǎng)問(wèn)私有的類(lèi)屬性:__color,錯(cuò)誤Traceback(mostrecentcalllast):#錯(cuò)誤信息提示File"<pyshell#13>",line1,in<module>car1.__colorAttributeError:'Car'objecthasnoattribute'__color'屬性的名前加兩個(gè)短畫(huà)線(xiàn)”__”即為私有屬性>>>Car.__color#通過(guò)類(lèi)對(duì)象Car訪(fǎng)問(wèn)私有的類(lèi)屬性:__color,錯(cuò)誤,只能在類(lèi)定義時(shí)使用Traceback(mostrecentcalllast):#錯(cuò)誤信息提示File"<pyshell#14>",line1,in<module>Car.__colorAttributeError:typeobject'Car'hasnoattribute'__color'方法和屬性是描述類(lèi)和對(duì)象行為及特征的關(guān)鍵組成部分。屬性與方法8類(lèi)屬性還可以在類(lèi)定義結(jié)束之后通過(guò)“類(lèi)名.新屬性”增加,如下給汽車(chē)類(lèi)Car增加id屬性:>>>Car.id=’201805150010001’>>>Car.id#在類(lèi)定義結(jié)束之后增加的id屬性為汽車(chē)類(lèi)Car的公有屬性。’201805150010001’>>>car1.id#汽車(chē)類(lèi)Car的任何一個(gè)實(shí)例化對(duì)象都可以訪(fǎng)問(wèn)增加的id屬性。'201805150010001'如果給已存在的類(lèi)屬性賦新值,則類(lèi)的默認(rèn)值和實(shí)例的值都變?yōu)樾碌闹?gt;>>C#查看汽車(chē)類(lèi)Car中定義的公有屬性name'passat'>>>C='polo'#在類(lèi)外部給汽車(chē)類(lèi)Car公有屬性name賦新的值'polo'>>>C#查看類(lèi)對(duì)象Car的name值'polo'#汽車(chē)類(lèi)對(duì)象Car公有屬性name值變?yōu)?polo'>>>car1=Car()#創(chuàng)建汽車(chē)類(lèi)Car實(shí)例化對(duì)象car1>>>#查看實(shí)例化對(duì)象car1的name值'polo'#汽車(chē)類(lèi)Car實(shí)例化對(duì)象car1的name值也變?yōu)?polo'如果在類(lèi)定義的外部對(duì)汽車(chē)類(lèi)Car進(jìn)行實(shí)例化,產(chǎn)生實(shí)例對(duì)象car1,然后對(duì)car1增加產(chǎn)地屬性adress,則該屬性為實(shí)例對(duì)象car1所特有,汽車(chē)類(lèi)Car和Car其它實(shí)例對(duì)象如car2并沒(méi)有該屬性>>>car1.address='beijing'>>>car1.adress'beijing'>>>car2=Car()>>>car2.adressTraceback(mostrecentcalllast):#錯(cuò)誤信息提示File"<pyshell#11>",line1,in<module>car2.adressAttributeError:'Car'objecthasnoattribute'adress'>>>Car.adressTraceback(mostrecentcalllast):File"<pyshell#19>",line1,in<module>Car.adressAttributeError:typeobject'Car'hasnoattribute'adress'屬性與方法9實(shí)例屬性:一般是在__init___構(gòu)造函數(shù)中定義的,定義時(shí)以self作為構(gòu)造函數(shù)的第一個(gè)形式參數(shù),其中函數(shù)體中的屬性前綴是self,即self.實(shí)例屬性。實(shí)例屬性只能通過(guò)實(shí)例對(duì)象名訪(fǎng)問(wèn),不能通過(guò)類(lèi)名訪(fǎng)問(wèn)實(shí)例屬性。>>>classCar: price='180000'#定義類(lèi)屬性 def__init__(self,c): #定義構(gòu)造函數(shù)

self.color=c

#定義實(shí)例屬性 defsetadress(self): self.adress='beijing'

#在類(lèi)的其它方法中給實(shí)例添加屬性一般不提倡>>>car1=Car('red')

#實(shí)例化對(duì)象>>>car2=Car('red')

#實(shí)例化對(duì)象>>>car1.color #查看實(shí)例car1屬性的值'red'>>>car2.color

#查看實(shí)例car2屬性的值'red'>>>Car.price #查看類(lèi)Car屬性的值'180000'>>>Car.color

#不能通過(guò)類(lèi)對(duì)象來(lái)查看實(shí)例對(duì)象的屬性color的值Traceback(mostrecentcalllast):

#錯(cuò)誤信息提示File"<pyshell#38>",line1,in<module>Car.colorAttributeError:typeobject'Car'hasnoattribute'color'

屬性與方法10>>>Car.price='200000'

#修改類(lèi)屬性值>>>car1.color=‘yellow'

#修改實(shí)例car1屬性>>>Car.price #查看類(lèi)Car屬性的值'200000'>>>car1.color

#查看car1屬性的值‘yellow'>>>car2.color #查看car2屬性的值'red'>>>car1.setadress()#查看在Car類(lèi)的其它方法中添加的實(shí)例屬性,要先通過(guò)實(shí)例調(diào)用該方法>>>car1.adress#查看在Car類(lèi)的其它方法中添加的實(shí)例屬性adress的值'beijing'類(lèi)中所定義的公有屬性是所有實(shí)例共有的,因此通過(guò)類(lèi)對(duì)象修改公有屬性后,每個(gè)實(shí)例對(duì)象的公有屬性也會(huì)隨之改變;而類(lèi)的構(gòu)造函數(shù)__init__()所定義的屬性是屬于實(shí)例的,其他方法中添加的屬性也是屬于實(shí)例的。屬性與方法112.方法類(lèi)方法:就是對(duì)類(lèi)的數(shù)據(jù)進(jìn)行操作的函數(shù),以完成相應(yīng)的功能,如改變類(lèi)的狀態(tài),進(jìn)行某個(gè)計(jì)算等。類(lèi)中方法的定義與函數(shù)基本相同,有以下幾點(diǎn)區(qū)別:①類(lèi)方法的第一個(gè)參數(shù)必須是self,而且不能省略;②方法的調(diào)用是使用“實(shí)例對(duì)象.方法”的形式進(jìn)行的;③類(lèi)的方法屬于類(lèi),函數(shù)是獨(dú)立的。

類(lèi)中定義的方法可以粗略分為:特殊方法、公有方法、私有方法、靜態(tài)方法和類(lèi)方法等。>>>classCar: __distance=0 def__init__(self,name):

#構(gòu)造函數(shù) self.__name=name Car.__distance+=1 defshow(self):#公有的實(shí)例方法 print("self.__name",self.__name) print("Car.distance",Car.__distance) @classmethod#修飾器,聲明類(lèi)方法 defclassShowdistance(cls):#類(lèi)方法 print(cls.__distance) @staticmethod

#修飾器,聲明靜態(tài)方法 defstaticShowdistance():

#靜態(tài)方法 print(Car.__distance)>>>car1=Car('passat')>>>car1.classShowdistance()

#通過(guò)實(shí)例對(duì)象來(lái)調(diào)用類(lèi)方法1>>>car1.staticShowdistance()

#通過(guò)實(shí)例對(duì)象來(lái)調(diào)用靜態(tài)方法1屬性與方法12>>>car1.show()#通過(guò)實(shí)例對(duì)象來(lái)調(diào)用公有實(shí)例方法self.__name:passatCar.__distance:1>>>car2=Car('benz')>>>Car.classShowdistance()

#通過(guò)類(lèi)名調(diào)用類(lèi)方法2>>>Car.staticShowdistance()

#通過(guò)類(lèi)名調(diào)用靜態(tài)方法2>>>Car.show()

#通過(guò)類(lèi)名直接調(diào)用實(shí)例方法失敗Traceback(mostrecentcalllast):File"<pyshell#72>",line1,in<module>Car.show()TypeError:show()missing1requiredpositionalargument:'self'>>>Car.show(car1)

#通過(guò)類(lèi)名調(diào)用實(shí)例方法時(shí)為self參數(shù)顯式傳遞對(duì)象名,訪(fǎng)問(wèn)實(shí)例屬性self.__name:passatCar.__distance:2>>>Car.show(car2)#通過(guò)類(lèi)名調(diào)用實(shí)例方法時(shí)為self參數(shù)顯式傳遞對(duì)象名,訪(fǎng)問(wèn)實(shí)例屬性self.__name:benzCar.__distance:2屬性與方法13①Python中類(lèi)的構(gòu)造函數(shù)(即構(gòu)造方法)是__init__(self,….),一般用來(lái)為對(duì)象屬性設(shè)置初值或進(jìn)行其它必要的初始化工作,在創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用和執(zhí)行。如果用戶(hù)沒(méi)有在類(lèi)中顯式設(shè)計(jì)構(gòu)造函數(shù),Python將提供一個(gè)默認(rèn)的構(gòu)造函數(shù)用來(lái)進(jìn)行必要的初始化工作。除構(gòu)造函數(shù)之外,Python還支持析構(gòu)函數(shù)、運(yùn)算符重載等大量的特殊方法。②類(lèi)方法是類(lèi)所擁有的方法,需要用修飾器@classmethod來(lái)聲明,第一個(gè)參數(shù)必須是類(lèi)對(duì)象,一般將cls作為類(lèi)方法的第一個(gè)參數(shù)名稱(chēng),但也可以使用其它的名字作為參數(shù),并且在調(diào)用類(lèi)方法時(shí)不需要為該參數(shù)傳遞值。

③靜態(tài)方法需要用修飾器@staticmethod來(lái)聲明是靜態(tài)方法,靜態(tài)方法可以沒(méi)有參數(shù),但如果要在靜態(tài)方法中引用類(lèi)屬性,必須通過(guò)類(lèi)來(lái)引用。類(lèi)方法和靜態(tài)方法都可以通過(guò)類(lèi)名和對(duì)象名調(diào)用,但不能直接訪(fǎng)問(wèn)屬于實(shí)例對(duì)象的屬性,只能訪(fǎng)問(wèn)屬于類(lèi)的屬性。類(lèi)對(duì)象和實(shí)例對(duì)象都可以調(diào)用類(lèi)方法和靜態(tài)方法。3屬性與方法目錄繼承2類(lèi)和對(duì)象1多態(tài)4項(xiàng)目實(shí)戰(zhàn)5單元小結(jié)615繼承是用來(lái)實(shí)現(xiàn)代碼復(fù)用和設(shè)計(jì)復(fù)用的機(jī)制,是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特性之一。設(shè)計(jì)一個(gè)新類(lèi)時(shí),如果可以繼承一個(gè)已有的設(shè)計(jì)良好的類(lèi),然后進(jìn)行二次開(kāi)發(fā),將大幅度減少開(kāi)發(fā)工作的代碼量。在繼承關(guān)系中,已有的、設(shè)計(jì)好的類(lèi)稱(chēng)為父類(lèi)、超類(lèi)或基類(lèi),新設(shè)計(jì)的類(lèi)稱(chēng)為子類(lèi)或派生類(lèi)。Python中類(lèi)繼承定義的一般形式如下:class子類(lèi)名(父類(lèi)名):

類(lèi)體>>>classPerson(object):#定義父類(lèi),其實(shí)父類(lèi)本身也是繼承了Python中的object類(lèi)

def__init__(self,name,age,sex):#定義構(gòu)造方法

=name

self.age=age

self.sex=sex

print('initperson:',)

defshowinfor(self):#定義實(shí)例方法

print('name:{};age:{};sex:{}'.format(,self.age,self.sex))>>>classTeacher(Person):

#定義Teacher子類(lèi),繼承Person類(lèi)

def__init__(self,name,age,sex,department):Person.__init__(self,name,age,sex)#必須在子類(lèi)中顯式調(diào)用父類(lèi)的構(gòu)造方法print('initTeachername:',self.name)self.department=departmentdefshowinfo(self):

Person.showinfor(self)#顯式調(diào)用父類(lèi)的實(shí)例方法,必須以self傳遞參數(shù)

print('department:',self.department)

繼承繼承16>>>classStudent(Person):#定義Student子類(lèi),繼承Person類(lèi)

def__init__(self,name,age,sex,marks): Person.__init__(self,name,age,sex)#必須在子類(lèi)中顯式調(diào)用父類(lèi)的構(gòu)造方法

self.marks=marks

print('initStudentname:',)

def

showinfo(self):

Person.showinfor(self)#顯式調(diào)用父類(lèi)的實(shí)例方法,必須以self傳遞參數(shù)

print('marks:',self.marks)>>>t=Teacher('Jake',36,'M','compute')initperson:JakeinitTeachername:Jake>>>t.showinfo()#調(diào)用派生類(lèi)的方法name:Jake;age:38;sex:Mdepartment:computer>>>s=Student('Rose',23,'F',90)initperson:RoseinitStudentname:Rose

>>>s.showinfo()#調(diào)用派生類(lèi)的方法name:Rose;age:23;sex:Fmarks:90繼承17Python支持多重繼承,所謂多重繼承是指子類(lèi)有兩個(gè)或兩個(gè)以上父類(lèi)。如果基類(lèi)有相同的方法名,而在子類(lèi)中使用時(shí)沒(méi)有指定基類(lèi)名,則Python解釋器將從左到右按順序搜索,執(zhí)行第一個(gè)搜索到的父類(lèi)中該同名方法。>>>classA(): defshow(self):

print("IcomefromclassA">>>classB(A):#類(lèi)B繼承了類(lèi)A

defshow(self):

print("IcomefromclassB")>>>classC(A):#類(lèi)C繼承了類(lèi)A defshow(self):

print("IcomefromclassC")>>>classD(B,C):#類(lèi)D是多重繼承,分別繼承類(lèi)B和類(lèi)Cpass#占位作用,不執(zhí)行>>>d=D()>>>d.show()#執(zhí)行類(lèi)B的方法IcomefromclassB3屬性與方法目錄繼承2類(lèi)和對(duì)象1多態(tài)4項(xiàng)目實(shí)戰(zhàn)5單元小結(jié)6多態(tài)19

多態(tài)(polymorphism)指的是一類(lèi)事物有多種形態(tài),一個(gè)抽象類(lèi)有多個(gè)子類(lèi),因而多態(tài)的概念依賴(lài)于繼承。如下,Animal動(dòng)物類(lèi),又分為Dog狗類(lèi)、Cat貓類(lèi)、Tiger虎類(lèi)。#定義基類(lèi)(父類(lèi)),其實(shí)基類(lèi)本身也是繼承了Python中的object類(lèi)>>>classAnimal(object):

def__init__(self,name):

=namedefsaymyself(self):#定義基類(lèi)的方法

print('In_Animal_class:Iama{}.'.format())>>>classCat(Animal):#定義子類(lèi)defsaymyself(self):#同名的方法實(shí)現(xiàn)不同的功能print('In_Cat_class:Iama{}.'.format())>>>classDog(Animal):#定義子類(lèi)defsaymyself(self):#同名的方法實(shí)現(xiàn)不同的功能print('In_Dog_class:Iama{}.'.format())>>>classTiger(Animal):#定義子類(lèi)defsaymyself(self):#同名的方法實(shí)現(xiàn)不同的功能print('In_Tiger_class:Iama{}.'.format())多態(tài)20>>>deftestfunc(obj):#定義一個(gè)調(diào)用函數(shù)print('{}say:'.format())

#輸出實(shí)例的name屬性值 obj.saymyself()#調(diào)用實(shí)例的方法>>>animal1=Animal('animal')#創(chuàng)建不同的對(duì)象>>>cat1=Cat('cat')>>>dog1=Dog('dog')>>>tiger1=Tiger('tiger')>>>lst=[animal1,cat1,dog1,tiger1]>>>foriinlst:print()testfunc(i)animal

#輸出基類(lèi)實(shí)例對(duì)象的屬性animalsay:In_Animal_class:Iamaanimal.#通過(guò)基類(lèi)實(shí)例對(duì)象調(diào)用基類(lèi)實(shí)例對(duì)象的方法cat

#輸出子類(lèi)實(shí)例對(duì)象的屬性catsay:In_Cat_class:Iamacat.#通過(guò)子類(lèi)實(shí)例對(duì)象調(diào)用子類(lèi)實(shí)例對(duì)象同名的方法,表現(xiàn)出多態(tài)dog

#輸出子類(lèi)實(shí)例對(duì)象的屬性dogsay:In_Cat_class:Iamadog.多態(tài)21tiger#輸出子類(lèi)實(shí)例對(duì)象的屬性tigersay:In_Tiger_class:Iamatiger.>>>isinstance(animal1,Animal)True>>>isinstance(cat1,Animal)True>>>isinstance(cat1,Cat)True>>>isinstance(dog1,Animal)True>>>isinstance(dog1,Dog)True>>>isinstance(dog1,Cat)False多態(tài)22

多態(tài)體現(xiàn)在多個(gè)方面:①方法的多態(tài)性,上述所定義的Car、Dog、Tiger類(lèi)都繼承了Animal類(lèi),但是每個(gè)子類(lèi)都對(duì)父類(lèi)的saymyself()進(jìn)行了重新定義,從而體現(xiàn)了方法的多態(tài)性。②變量的多態(tài)性,通過(guò)isinstance()函數(shù)的測(cè)試可以看到,dog1既是Animal的實(shí)例,又是Dog的實(shí)例,以此可以看到變量的多態(tài)性。③參數(shù)的多態(tài)性,“deftestfunc(obj):”所定義函數(shù)的參數(shù)obj,可以是任何的對(duì)象,因此在“>>>foriinlst: print()testfunc(i)”

語(yǔ)句中調(diào)用testfunc()時(shí),分別傳遞了animal1、cat1、dog1和tiger1實(shí)例對(duì)象。從而體現(xiàn)了參數(shù)的多態(tài)性,其實(shí)我們?cè)诘?單元函數(shù)部分,就已經(jīng)在用了參數(shù)的多態(tài)性,當(dāng)時(shí)我們定義了add(x,y)函數(shù),可以對(duì)整數(shù)、實(shí)數(shù)、復(fù)數(shù)以及列表、元組和字符串求和,所求的和,是根據(jù)輸入?yún)?shù)來(lái)確定的。多態(tài)23

【例4-1】請(qǐng)用面向?qū)ο蟮姆椒ň幊逃?jì)算圓和矩形的面積。要求定義的一個(gè)形狀基類(lèi),圓和矩形是子類(lèi)。

分析:形狀基數(shù)的定義,由于不同形狀所具有的屬性不相同,因此形狀基類(lèi)只定義了一個(gè)area()方法。各子類(lèi)中分別定義各自形狀的特征屬性,并且在各子類(lèi)中分別重載area()方法。#ch4_1.pyimportmath#定義一個(gè)基類(lèi)classShape:defarea(self):return0.0#定義子類(lèi)圓classCircle(Shape):def__init__(self,r=0.0):self.r=rdefarea(self):returnmath.pi*self.r*self.r#定義子類(lèi)矩形

classRectangle(Shape):def__init__(self,a,b):self.a,self.b=a,bdefarea(self):returnself.a*self.bif__name__=="__main__":#計(jì)算半徑為5的圓的面積c=Circle(5)print("半徑=",c.r,”面積=",c.area())#計(jì)算矩形的面積r=Rectangle(12.5,5.6)print("矩形的邊長(zhǎng)分別是:",r.a,",",r.b,"面積是:",r.area())3屬性與方法目錄繼承2類(lèi)和對(duì)象1多態(tài)4項(xiàng)目實(shí)戰(zhàn)5單元小結(jié)6項(xiàng)目實(shí)戰(zhàn)→簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)

通過(guò)對(duì)學(xué)生成績(jī)管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn),進(jìn)一步理解面向?qū)ο蟪绦蛟O(shè)計(jì)方法,會(huì)用面向?qū)ο蟪绦蛟O(shè)計(jì)方法完成小型系統(tǒng)的開(kāi)發(fā)。項(xiàng)目目標(biāo)項(xiàng)目?jī)?nèi)容簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)要求具有課程與成績(jī)錄入、總分計(jì)算、按總分排序、最高分和最低分計(jì)算等功能。信息輸入和輸出要簡(jiǎn)潔明了,增加必要的提示等。姓名C#JAVA英語(yǔ)數(shù)學(xué)總分李明65723686

王兵81706571

劉萍73648865

課程名稱(chēng)任課教師C#王長(zhǎng)榮JAVA李小小英語(yǔ)劉衛(wèi)兵數(shù)學(xué)張常來(lái)學(xué)生成績(jī)登記表課程與教師表

本學(xué)生成績(jī)管理系統(tǒng)就是幫班主任完成“學(xué)生成績(jī)登記表”和“課程與教師表”基本信息的錄入,并求總分、排名和最高分及最低分。項(xiàng)目實(shí)戰(zhàn)→簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)實(shí)施步驟①設(shè)計(jì)分析

本系統(tǒng)功能相對(duì)簡(jiǎn)單,關(guān)鍵是如何合理地定義相關(guān)的類(lèi)來(lái)描述對(duì)象。這里設(shè)計(jì)分?jǐn)?shù)(Score)、課程(Subject)以及學(xué)生(Student)三個(gè)類(lèi)。分?jǐn)?shù)(Score)類(lèi)具有分?jǐn)?shù)屬性和輸入、輸出功能;課程(Subject)類(lèi)具有課程名稱(chēng)和任課教師兩個(gè)屬性,以及輸入、輸出功能;學(xué)生(Student)類(lèi)具有姓名、成績(jī)、課程等屬性和輸入成績(jī)、輸出成績(jī)、求總分等功能。②程序編寫(xiě)#ch4_p_1.py#簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)#定義分?jǐn)?shù)類(lèi)classScore():def__init__(self):self.s=0definput(self):self.s=float(input("請(qǐng)輸入分?jǐn)?shù)(0~100):"))defoutput(self):print(self.s,end='')#定義課程類(lèi),包含課程名稱(chēng)和教師classSubject():def__init__(self):self.subject=''self.teacher=''definput(self):self.subject=str(input("請(qǐng)輸入課程名稱(chēng):"))self.teacher=str(input("請(qǐng)輸入任課教師:"))defoutput(self):print(self.subject,self.teacher)項(xiàng)目實(shí)戰(zhàn)→簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)實(shí)施步驟#定義學(xué)生類(lèi)classStudent():def__init__(self,s):=''self.sum=0self.grade={}self.subject=s#輸入每門(mén)課的成績(jī),用字典進(jìn)行存儲(chǔ)

definput(self):=str(input("請(qǐng)輸入學(xué)生姓名:"))foriinself.subject:#成績(jī)輸入print(i.subject,'課程',end=":")s=Score()s.input()self.grade[i]=s#求總分defcount(self):foriinself.subject:self.sum+=self.grade[i].s#輸出每門(mén)課的成績(jī)及總分defoutput(self):print(,end='')foriinself.subject:self.grade[i].output()print(self.sum)#課程輸入函數(shù),返回課程列表

defkc():print("***課程信息輸入***")sub=[]whileTrue:subject=Subject()subject.input()ifsubject.subject=='**':#以輸入"**"結(jié)束breakelse:sub.append(subject)returnsub

#學(xué)生成績(jī)輸入函數(shù),返回全部學(xué)生列表

defcj(sub):print("***學(xué)生信息輸入***")class_jd=[]whileTrue:stu=Student(sub)stu.input()#每門(mén)課程成績(jī)輸入stu.count()#求總分class_jd.append(stu)ifinput("繼續(xù)錄入學(xué)生嗎(y/n)?")in['n','N']:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論