《Python程序設(shè)計(jì)》教學(xué)課件-05面向?qū)ο缶幊蘝第1頁(yè)
《Python程序設(shè)計(jì)》教學(xué)課件-05面向?qū)ο缶幊蘝第2頁(yè)
《Python程序設(shè)計(jì)》教學(xué)課件-05面向?qū)ο缶幊蘝第3頁(yè)
《Python程序設(shè)計(jì)》教學(xué)課件-05面向?qū)ο缶幊蘝第4頁(yè)
《Python程序設(shè)計(jì)》教學(xué)課件-05面向?qū)ο缶幊蘝第5頁(yè)
已閱讀5頁(yè),還剩62頁(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)介

面向?qū)ο缶幊蹋∣bjectOrientedProgramming,OOP)是一種程序設(shè)計(jì)架構(gòu),同時(shí)也是一種程序開(kāi)發(fā)的方法。第5章面向?qū)ο缶幊棠夸浀?章面向?qū)ο缶幊?.1類和對(duì)象5.1.1類和對(duì)象的概念5.1.2類的定義5.1.3類的成員5.1.4創(chuàng)建對(duì)象5.1.5在類的內(nèi)部調(diào)用實(shí)例方法5.1.6構(gòu)造方法5.1.7類變量、實(shí)例變量及其作用域5.1.8實(shí)例方法、類方法和靜態(tài)方法5.2類的封裝5.2.1封裝的概念5.2.2用私有變量、私有方法實(shí)現(xiàn)封裝5.2.3用@property裝飾器定義屬性實(shí)現(xiàn)封裝

5.3類的繼承5.3.1繼承的概念5.3.2使用繼承5.3.3重寫(xiě)方法5.3.4派生屬性或方法5.3.5多重繼承5.4類的多態(tài)5.4.1多態(tài)的實(shí)現(xiàn)5.4.2多態(tài)性5.5習(xí)題5.1類和對(duì)象5.1.1類和對(duì)象的概念對(duì)象(Object)抽象為類(Class)的過(guò)程,是在系統(tǒng)分析階段完成的。在現(xiàn)實(shí)世界中,先有一個(gè)一個(gè)具體的對(duì)象,然后將對(duì)象進(jìn)行分類,總結(jié)出類。在程序中,必須先定義類,后調(diào)用類來(lái)產(chǎn)生對(duì)象。類并不能直接使用,通過(guò)類創(chuàng)建出的實(shí)例(又稱對(duì)象)才能使用。5.1類和對(duì)象5.1.2類的定義在編程時(shí),使用類的順序是:先定義(創(chuàng)建)類,然后再創(chuàng)建類的對(duì)象(實(shí)例),通過(guò)對(duì)象實(shí)現(xiàn)特定的功能。Python中,創(chuàng)建一個(gè)類使用class關(guān)鍵字實(shí)現(xiàn),其基本語(yǔ)法格式如下:class類名:

類的成員1…

類的成員n5.1.3類的成員在類的定義中,類的成員可以分為3種:類變量、方法和屬性。屬性在“5.2類的封裝”介紹,這里先介紹類變量和方法。1.類變量Python中,類中的變量分為:類變量和實(shí)例變量。這里介紹類變量。在類體中定義的變量稱為類變量(也稱類字段、成員字段、成員變量),類變量也是廣義上的屬性,稱為類屬性。格式如下。class類名:

類變量名=初值

類的其他成員說(shuō)明:1)類變量是指在類中,且在方法之外定義的變量。2)初值表示該字段的初始狀態(tài),例如:student_age=18#年齡,整型,初值18歲5.1類和對(duì)象2.實(shí)例方法在類的內(nèi)部,使用def關(guān)鍵字定義實(shí)例方法,語(yǔ)法格式如下。class類名:

類變量名=值

…def方法名(self,形參1,形參2,…,形參n)self.實(shí)例變量名=值變量名=值方法體

return表達(dá)式類的其他成員實(shí)例方法必須包含參數(shù)self,且為第一個(gè)參數(shù),不能省略。5.1類和對(duì)象5.1類和對(duì)象【例5-1】定義學(xué)生類Student。屬性:姓名name、性別gender、年齡age、班級(jí)grade。方法:顯示學(xué)習(xí)的課程learn(course),course是顯示的課程名稱;顯示考試的課程exam(course,score),course是課程,score是成績(jī)。classStudent:#定義類

#定義類變量

name=""#姓名

gender="男"#性別,默認(rèn)“男”

age=18#年齡,默認(rèn)18歲

grade=""#班級(jí)

#定義實(shí)例方法

definfo(self):print(,self.gender,self.age,self.grade)#在方法中訪問(wèn)類變量使用self關(guān)鍵字

deflearn(this,course):#獲取學(xué)習(xí)課程字符串的方法,形參course代表課程

+"正在學(xué)習(xí)"+course#self可以換成任何標(biāo)識(shí)符,這里是thisdefexam(self,course,score):#獲取考試課程字符串的方法,形參course代表課程,score代表成績(jī)

string=+course+"的考試成績(jī)是"+str(score)#定義局部變量stringreturnstring5.1類和對(duì)象【例5-2】計(jì)算長(zhǎng)方體的體積和表面積。定義長(zhǎng)方體類Cuboid。屬性:長(zhǎng)length、寬width、高h(yuǎn)eight。方法:計(jì)算長(zhǎng)方體的體積cubage,長(zhǎng)方體的體積=長(zhǎng)×寬×高;計(jì)算長(zhǎng)方體的表面積totalArea,長(zhǎng)方體的表面積=(長(zhǎng)×寬+長(zhǎng)×高+寬×高)×2。classCuboid:#定義類變量

length=0#長(zhǎng)

width=0#寬

height=0#高

#定義實(shí)例方法

defcubage(self):#計(jì)算長(zhǎng)方體的體積

returnself.length*self.width*self.heightdeftotal_area(self):#計(jì)算長(zhǎng)方體的表面積

return(self.length*self.width+self.length*self.height+self.width*self.height)*25.1類和對(duì)象【例5-2】計(jì)算長(zhǎng)方體的體積和表面積。定義長(zhǎng)方體類Cuboid。屬性:長(zhǎng)length、寬width、高h(yuǎn)eight。方法:計(jì)算長(zhǎng)方體的體積cubage,長(zhǎng)方體的體積=長(zhǎng)×寬×高;計(jì)算長(zhǎng)方體的表面積totalArea,長(zhǎng)方體的表面積=(長(zhǎng)×寬+長(zhǎng)×高+寬×高)×2。也可以把方法改成傳參的形式,代碼如下:classCuboid1:#定義實(shí)例方法

defcubage(self,length,width,height):#計(jì)算長(zhǎng)方體的體積,形參:長(zhǎng),寬,高

returnlength*width*heightdeftotal_area(self,length,width,height):#計(jì)算長(zhǎng)方體的表面積,形參:長(zhǎng),寬,高

return(length*width+length*height+width*height)*25.1.4創(chuàng)建對(duì)象1.創(chuàng)建對(duì)象創(chuàng)建類的實(shí)例也稱實(shí)例化一個(gè)類的對(duì)象,簡(jiǎn)稱創(chuàng)建對(duì)象。對(duì)已創(chuàng)建的類進(jìn)行實(shí)例化,其語(yǔ)法格式如下:類名()創(chuàng)建的對(duì)象或?qū)嵗x值給一個(gè)變量,賦值后該變量就表示這個(gè)類的一個(gè)對(duì)象。其格式為:變量名(或稱對(duì)象名)=類名()例如,下面的代碼創(chuàng)建Student類的實(shí)例,并賦給stu對(duì)象,對(duì)stu對(duì)象進(jìn)行初始化。stu=Student()#創(chuàng)建Student類的實(shí)例,并賦值給stu變量,stu變量的類型是類Student的類型5.1類和對(duì)象2.對(duì)象訪問(wèn)實(shí)例變量和實(shí)例方法(1)對(duì)象訪問(wèn)實(shí)例變量在主程序中(或類的外部),使用已創(chuàng)建的對(duì)象訪問(wèn)類中變量(實(shí)例變量或類變量)的語(yǔ)法格式如下:對(duì)象名.變量名注意:實(shí)例變量只能通過(guò)“對(duì)象名.實(shí)例變量名”訪問(wèn),無(wú)法通過(guò)“類名.實(shí)例變量名”訪問(wèn)。為對(duì)象中的變量(實(shí)例變量或類變量)賦值的語(yǔ)法格式如下:對(duì)象名.變量名=值(2)對(duì)象訪問(wèn)實(shí)例方法訪問(wèn)對(duì)象中實(shí)例方法的語(yǔ)法格式如下:對(duì)象名.方法名(實(shí)參1,實(shí)參2,…,實(shí)參n)注意:對(duì)象名與實(shí)例變量名、方法名之間用點(diǎn)“.”連接。5.1類和對(duì)象3.類和對(duì)象應(yīng)用示例【例5-3】通過(guò)在例5-1中已經(jīng)定義的類,創(chuàng)建兩個(gè)對(duì)象,分別是“劉強(qiáng)”和“王芳”。liuqiang=Student()#創(chuàng)建Student()類的一個(gè)對(duì)象,并賦值給liuqiang變量#初始化類變量="劉強(qiáng)"#用“對(duì)象名.類變量”訪問(wèn)liuqiang.age=19liuqiang.grade="計(jì)算機(jī)科學(xué)2019"#調(diào)用方法()#顯示liuqiang對(duì)象的基本信息print(liuqiang.learn("數(shù)學(xué)"))print(liuqiang.exam("數(shù)學(xué)",85))print()#顯示一個(gè)空行,用于隔開(kāi)兩位學(xué)生的信息wangfang=Student()#創(chuàng)建Student()類的一個(gè)對(duì)象,并賦值給wangfang變量#初始化類變量="王芳"wangfang.gender="女"wangfang.age=18wangfang.grade="哲學(xué)2019"5.1類和對(duì)象5.1類和對(duì)象#調(diào)用方法()print(wangfang.learn("英語(yǔ)"))print(wangfang.exam("英語(yǔ)",96))【例5-4】在例5-2定義類的基礎(chǔ)上,編寫(xiě)創(chuàng)建對(duì)象和調(diào)用屬性、方法的代碼。cu=Cuboid()#Cuboid()類的一個(gè)對(duì)象,并賦值給cu變量cu.length=10#長(zhǎng)cu.width=20#寬cu.height=30#高print(cu.cubage())print(cu.total_area())調(diào)用Cuboid1()中帶參數(shù)的方法,代碼如下:cu1=Cuboid1()#Cuboid1()類的一個(gè)對(duì)象,并賦值給cu1變量print(cu1.cubage(10,20,30))print(cu1.total_area(10,20,30))5.1類和對(duì)象5.1.5在類的內(nèi)部調(diào)用實(shí)例方法在類的內(nèi)部調(diào)用實(shí)例方法的格式為:self.方法名(實(shí)參1,實(shí)參2,…,實(shí)參n)或類名.方法名(self,實(shí)參1,實(shí)參2,…,實(shí)參n)在類的內(nèi)部調(diào)用實(shí)例方法,如果不使用類名調(diào)用方法,則方法名前使用self;如果使用類名調(diào)用方法,則實(shí)參列表中使用self?!纠?-5】在類的內(nèi)部和外部調(diào)用實(shí)例方法示例。classHuman:defeat(self,name):=name#把形參name賦值給創(chuàng)建的實(shí)例變量print("eatand%s"%)defdrink(self):self.eat("drink")#在類中訪問(wèn)方法:self.方法名()Human.eat(self,"drink")#在類中調(diào)用方法:類名.方法名(self)man=Human()#創(chuàng)建對(duì)象man.drink()#在類外調(diào)用方法,對(duì)象調(diào)用方法:對(duì)象名.方法名()5.1類和對(duì)象5.1.6構(gòu)造方法1.構(gòu)造方法的概念當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),對(duì)象表示一個(gè)實(shí)體。例如,下面的代碼st=Student()#創(chuàng)建對(duì)象="張三"#設(shè)置屬性值,使該對(duì)象的name值為"張三"st.age=18#設(shè)置屬性值,使該對(duì)象的age值為18構(gòu)造方法又叫構(gòu)造函數(shù)、構(gòu)造器,它是類的一種特殊的成員方法,在創(chuàng)建類的新對(duì)象時(shí)自動(dòng)調(diào)用構(gòu)造方法。它主要用于在創(chuàng)建對(duì)象時(shí)初始化對(duì)象,即為對(duì)象成員變量賦初始值。2.定義構(gòu)造方法在創(chuàng)建類時(shí),可以添加一個(gè)__init__()方法。該方法是一個(gè)特殊的類實(shí)例方法,稱為構(gòu)造方法。每個(gè)類都必須至少有一個(gè)構(gòu)造方法。構(gòu)造方法的語(yǔ)法格式如下:def__init__(self,形參1,形參2,…,形參n):self.實(shí)例變量名1=值1self.實(shí)例變量名2=值2

方法體構(gòu)造方法是類的一個(gè)特殊的成員方法,除了具有一般成員方法的特點(diǎn)外,它還有自己獨(dú)有的特點(diǎn)。5.1類和對(duì)象5.1類和對(duì)象3.調(diào)用構(gòu)造方法在聲明類時(shí),一個(gè)類中會(huì)包默認(rèn)的構(gòu)造方法,也可能包含自定義構(gòu)造方法。(1)調(diào)用默認(rèn)構(gòu)造方法假設(shè)一個(gè)類包含默認(rèn)的構(gòu)造方法,則調(diào)用默認(rèn)構(gòu)造方法的語(yǔ)法如下。對(duì)象名=類名()(2)調(diào)用自定義構(gòu)造方法自定義構(gòu)造方法包括無(wú)參或有參構(gòu)造函數(shù)。1)調(diào)用自定義無(wú)參構(gòu)造方法。自定義無(wú)參構(gòu)造方法的調(diào)用與默認(rèn)構(gòu)造方法的調(diào)用相同。2)調(diào)用有參構(gòu)造方法。調(diào)用有參構(gòu)造方法的語(yǔ)法如下。對(duì)象名=類名(實(shí)參1,實(shí)參2,…,實(shí)參n)實(shí)參列表中的參數(shù)可以是數(shù)據(jù)對(duì)象、變量或表達(dá)式,參數(shù)之間用逗號(hào)分隔。例如,如下代碼在創(chuàng)建Student對(duì)象時(shí)傳入?yún)?shù):st=Student("張三豐",18)print(,st.age)5.1類和對(duì)象4.構(gòu)造方法實(shí)例【例5-6】在Student類的__init__()方法中,定義兩個(gè)實(shí)例變量gender和age,并且直接賦值。在創(chuàng)建Student的對(duì)象st時(shí),采用無(wú)參數(shù)創(chuàng)建對(duì)象,它會(huì)隱式調(diào)用__init__()方法,然后Student類的對(duì)象st中的實(shí)例變量就被賦值了。classStudent:def__init__(self):#定義無(wú)參構(gòu)造方法

print("調(diào)用構(gòu)造方法")self.gender="男"#self.gender表示gender是實(shí)例變量,通過(guò)“=”創(chuàng)建該實(shí)例變量

self.age=18st=Student()#創(chuàng)建對(duì)象,構(gòu)造方法無(wú)參數(shù)print("st的性別:{0},年齡:{1}".format(st.gender,st.age))5.1類和對(duì)象【例5-7】用__init__()方法傳遞參數(shù)。classStudent:def__init__(self,name,gender,age):#定義有參構(gòu)造方法,小括號(hào)中是定義的形參名

print("調(diào)用構(gòu)造方法")=name#“=”左邊的name是定義的實(shí)例變量,右邊的name是形參名

self.gender=genderself.age=agest=Student("王芳","女",19)#有參數(shù)創(chuàng)建對(duì)象print("st的姓名:{0},性別:{1},年齡:{2}".format(,st.gender,st.age))5.1類和對(duì)象【例5-8】對(duì)例5-2中的類,用__init__()方法重新定義類。classCuboid:def__init__(self,length,width,height):self.length=length#實(shí)例變量作為屬性用

self.width=widthself.height=heightdefcubage(self):#計(jì)算長(zhǎng)方體的體積

returnself.length*self.width*self.height#訪問(wèn)實(shí)例變量

deftotal_area(self):#計(jì)算長(zhǎng)方體的表面積

return(self.length*self.width+self.length*self.height+self.width*self.height)*2if__name__=='__main__':cu=Cuboid(10,20,30)#創(chuàng)建對(duì)象,用構(gòu)造方法的參數(shù)初始化

print(cu.cubage())print(cu.total_area())5.1類和對(duì)象【例5-9】定義一個(gè)兩個(gè)數(shù)的加法類NumberAdd,通過(guò)__init__()方法初始化兩個(gè)數(shù),定義一個(gè)實(shí)例方法add()計(jì)算兩個(gè)數(shù)的和。classNumberAdd:a=5#定義在類中但在函數(shù)體外的變量為類變量

def__init__(self,a,b):self.x=a#self.x、self.y是實(shí)例變量

self.y=b#a、b是形參,a、b是本方法內(nèi)的局部變量

print("a={0},b={1}".format(a,b))print("self.x={0},self.y={1}".format(self.x,self.y))print("self.a=",self.a)defadd(self):#定義兩個(gè)數(shù)相加的方法

sum=self.x+self.y#在類內(nèi)訪問(wèn)實(shí)例變量

returnsumprint("a=",a)#顯示類變量a的值if__name__=='__main__':a=10#加數(shù)

b=20#被加數(shù)

number=NumberAdd(a,b)#創(chuàng)建對(duì)象并初始化

print("{0}+{1}={2}".format(a,b,number.add()))#顯示兩個(gè)數(shù)的和運(yùn)行結(jié)果如下:a=5a=10,b=20self.x=10,self.y=20self.a=510+20=305.1類和對(duì)象5.1.7類變量、實(shí)例變量及其作用域1.類變量類變量是指在類中且在方法之外定義的變量。在主程序中(或類的外部),類變量推薦用“類名.類變量名”訪問(wèn),但也可以使用“對(duì)象名.類變量名”訪問(wèn)(此方式不推薦使用,即類變量通常不作為實(shí)例變量使用)。【例5-10】訪問(wèn)例5-1中定義的類變量name、gender、age和grade。S="劉強(qiáng)"#用“類名.類變量”訪問(wèn)Student.gender="男"Student.age=19Student.grade="計(jì)算機(jī)科學(xué)2019"5.1類和對(duì)象2.實(shí)例變量從實(shí)例化的角度來(lái)說(shuō),實(shí)例變量的定義為,實(shí)例化之后,每個(gè)實(shí)例(對(duì)象)單獨(dú)擁有的變量叫作實(shí)例變量。實(shí)例變量是與某個(gè)類的實(shí)例相關(guān)聯(lián)的數(shù)據(jù)值,這些值獨(dú)立于其他實(shí)例或類。注意,實(shí)例變量只能通過(guò)對(duì)象名訪問(wèn),無(wú)法通過(guò)類名直接訪問(wèn)。在方法中,只要以self定義的變量都是實(shí)例變量。實(shí)例變量的定義如下:self.變量名=值調(diào)用實(shí)例變量有如下兩種方式。1)在類外通過(guò)對(duì)象直接調(diào)用。2)在類內(nèi)通過(guò)self間接調(diào)用。5.1類和對(duì)象【例5-11】類變量和實(shí)例變量在訪問(wèn)和賦值后的不同。classDemo:aa="我是類變量aa"deffunc(self,name):self.bb=name#bb是實(shí)例變量if__name__=='__main__':print("Demo.aa=",Demo.aa)Demo.aa="Demo類,為類變量aa第1次賦值"obj1=Demo()#創(chuàng)建對(duì)象obj1#obj1.aa="obj1對(duì)象,為實(shí)例變量aa賦值"#稍后取消注釋

obj1.func("obj1對(duì)象,為實(shí)例變量bb賦值")print("Demo.aa=",Demo.aa)#顯示類變量Demo.aa的值

print("obj1.aa=",obj1.aa)#顯示對(duì)象obj1.aa的值

print("obj1.bb=",obj1.bb)#顯示對(duì)象obj1.bb的值

print()obj2=Demo()#創(chuàng)建對(duì)象obj25.1類和對(duì)象#obj2.aa="obj2對(duì)象,為實(shí)例變量aa賦值"#稍后取消注釋

obj2.func("obj2對(duì)象,為實(shí)例變量bb賦值")Demo.aa="Demo類,為類變量aa第2次賦值"print("Demo.aa=",Demo.aa)#訪問(wèn)Demo.aaprint("obj2.aa=",obj2.aa)#訪問(wèn)obj2.aaprint("obj2.bb=",obj2.bb)#訪問(wèn)obj2.bbprint()print("id(Demo.aa)=",id(Demo.aa))#顯示內(nèi)存中的地址

print("id(obj1.aa)=",id(obj1.aa))print("id(obj2.aa)=",id(obj2.aa))5.1類和對(duì)象3.實(shí)例變量的作用域私有成員在類的外部不能直接訪問(wèn),如果要在類的外部訪問(wèn),只能通過(guò)調(diào)用類里面的公有成員方法間接訪問(wèn),或者通過(guò)Python支持的特殊方式訪問(wèn)。【例5-12】在__init__()方法中初始化一個(gè)實(shí)例變量及一個(gè)私有的實(shí)例變量。定義一個(gè)給實(shí)例變量賦值的方法、一個(gè)給私有變量賦值的方法、一個(gè)得到實(shí)例變量的方法,以及一個(gè)得到私有變量的方法。5.1類和對(duì)象classTest:def__init__(self,x,y):self._x=x#定義實(shí)例變量

self.__y=y#定義私有的實(shí)例變量

defsetX(self,x):self._x=x#給實(shí)例變量賦值

defsetY(self,y):self.__y=y#給私有的實(shí)例變量賦值

defgetX(self):returnself._x#得到實(shí)例變量

defgetY(self):returnself.__y#得到私有的實(shí)例變量

defshow(self):print('self._x=',self._x)#在類內(nèi)訪問(wèn)實(shí)例變量

print('self.__y=',self.__y)#在類內(nèi)訪問(wèn)私有的實(shí)例變量if__name__=='__main__':t=Test(2,3)#創(chuàng)建對(duì)象并初始化

print('創(chuàng)建對(duì)象并初始化后顯示_x,__y(2,3)的值')print(t._x)#在類外訪問(wèn)實(shí)例變量

print(t.__y)#在類外訪問(wèn)對(duì)象的私有變量5.1類和對(duì)象把類外的程序改為如下。if__name__=='__main__':t=Test(2,3)#創(chuàng)建對(duì)象并初始化

print('創(chuàng)建對(duì)象并初始化后顯示_x,__y(2,3)的值')t.show()#調(diào)用實(shí)例方法t.show()print(t.getX(),t.getY())#調(diào)用實(shí)例方法t.getX(),t.getY()t._x=4#給實(shí)例變量賦值

t.__y=5#這里實(shí)際是新建了一個(gè)與私有變量__y同名的變量

print('給變量賦值后顯示_x,__y(4,5)的值(__y的值沒(méi)有變)')t.show()#self.__y的顯示結(jié)果仍是3print(t.getX(),t.getY())t.setX(6)t.setY(7)#用方法給私有變量賦值,賦值成功

print('用方法設(shè)置值后顯示_x,__y(6,7)的值')t.show()print(t.getX(),t.getY())print(t._Test__y)#用特殊方法訪問(wèn)私有變量5.1類和對(duì)象運(yùn)行顯示結(jié)果如下:創(chuàng)建對(duì)象并初始化后顯示_x,__y(2,3)的值self._x=2self.__y=323給變量賦值后顯示_x,__y(4,5)的值(__y的值沒(méi)有變)self._x=4self.__y=343用方法設(shè)置值后顯示_x,__y(6,7)的值self._x=6self.__y=76775.1類和對(duì)象在Python中,以下畫(huà)線開(kāi)頭的變量名和方法名有特殊的含義,尤其是在類的定義中,用下畫(huà)線作為變量名和方法名前綴和后綴來(lái)表示類的特殊成員。1)_×××:這樣的變量名或方法名叫保護(hù)成員,不能用“frommoduleimport*”導(dǎo)入,只有類對(duì)象和子類對(duì)象能訪問(wèn)。2)__×××__:系統(tǒng)定義的特殊成員。3)__×××:類中的私有成員,只有類對(duì)象自己能訪問(wèn),子類對(duì)象也不能訪問(wèn)這個(gè)成員,但在對(duì)象外部可以通過(guò)“對(duì)象名._類名__×××”這樣的特殊方式來(lái)訪問(wèn)。也就是說(shuō),Python中不存在嚴(yán)格意義上的私有成員。在IDLE的文件方式或交互方式中,在對(duì)象或類名后輸入一個(gè)小數(shù)點(diǎn)“.”后等3秒鐘,則會(huì)顯示一個(gè)列表框,列出其所有公開(kāi)成員,如圖5-5所示,模塊也具有同樣的特點(diǎn)。如果在小數(shù)點(diǎn)“.”后面再加一個(gè)下畫(huà)線,則會(huì)在列表框中列出該對(duì)象或類的所有成員,包括私有成員,如圖5-6所示。5.1類和對(duì)象5.1.8實(shí)例方法、類方法和靜態(tài)方法1.實(shí)例方法在定義方法時(shí),如果方法的形參以self作為第一個(gè)參數(shù),則該方法為實(shí)例方法(也稱普通方法)。構(gòu)造方法也屬于實(shí)例方法,只不過(guò)它比較特殊。在類內(nèi),分別使用“self.類變量名”和“self.實(shí)例變量名”訪問(wèn)類變量和實(shí)例變量。2.類方法在定義方法時(shí),如果方法的形參以cls作為第一個(gè)參數(shù),并且使用@classmethod修飾,則該方法為類方法。注意,如果沒(méi)有@classmethod修飾,則Python解釋器會(huì)將該方法認(rèn)定為實(shí)例方法,而不是類方法。在類方法內(nèi),使用“cls.類變量名”訪問(wèn)類變量,但是不能訪問(wèn)實(shí)例變量。3.靜態(tài)方法在定義方法時(shí),如果不設(shè)置默認(rèn)參數(shù),并且使用@staticmethod修飾,則該方法為靜態(tài)方法。靜態(tài)方法其實(shí)就是函數(shù),它與函數(shù)的區(qū)別是,靜態(tài)方法定義在類這個(gè)空間(類命名空間)中,而函數(shù)則定義在程序所在的空間(全局命名空間)中。靜態(tài)方法沒(méi)有self、cls等特殊參數(shù)。靜態(tài)方法可以通過(guò)類名或?qū)嵗龑?duì)象名來(lái)調(diào)用。5.1類和對(duì)象【例5-13】在Person類中定義實(shí)例方法、類方法、靜態(tài)方法,然后用類名、對(duì)象名訪問(wèn)這些方法。classPerson:gender="Male"#定義類變量(靜態(tài)的變量)

def__init__(self,name="Jack",age=18):#構(gòu)造方法也屬于實(shí)例方法

=name#定義實(shí)例變量

self.age=agedefshow(self):#定義實(shí)例方法

return'實(shí)例方法show:'++self.gender+str(self.age)#類內(nèi)訪問(wèn)實(shí)例變量、類變量

@classmethod#classmethod修飾的方法是類方法

defeat(cls,name,age):eat_name=name#類方法內(nèi)無(wú)法訪問(wèn)實(shí)例變量

eat_gender=cls.gender#使用“cls.類變量名”訪問(wèn)類變量

eat_age=str(age)#方法內(nèi)定義的變量,類外不可用

return'類方法eat:'+eat_name+eat_gender+eat_age@classmethod#classmethod修飾的方法是類方法

defrun(cls):return'類方法run:'+str(cls)

@staticmethod#staticmethod修飾的方法是靜態(tài)方法

defsleep(a):#s=self.x+#靜態(tài)方法內(nèi)無(wú)法訪問(wèn)類變量和實(shí)例變量

s="zZ@#"+a#方法內(nèi)定義的變量,類外不可用

return'靜態(tài)方法sleep:'+sprint("用類名調(diào)用",Person.eat("Jack",18))#用類名調(diào)用方法,Person類會(huì)自動(dòng)綁定到第一個(gè)參數(shù)print("用類名調(diào)用",Person.run())#用類名調(diào)用類方法,Person類會(huì)自動(dòng)綁定到第一個(gè)參數(shù)print("用類名調(diào)用",Person.sleep("ZZZ..."))#用類名調(diào)用靜態(tài)方法per=Person("Jenny",19)#創(chuàng)建對(duì)象print("用對(duì)象名調(diào)用",per.eat("Jenny",19))#用對(duì)象調(diào)用eat()類方法,其實(shí)依然是使用類調(diào)用print("用對(duì)象名調(diào)用",per.run())#因此第一個(gè)參數(shù)依然被自動(dòng)綁定到Person類print("用對(duì)象名調(diào)用",per.sleep("zzz..."))#用對(duì)象調(diào)用靜態(tài)方法print("用對(duì)象名調(diào)用",per.show())#用對(duì)象調(diào)用show()實(shí)例方法運(yùn)行結(jié)果為:用類名調(diào)用類方法eat:JackMale18用類名調(diào)用類方法run:<class'__main__.Person'>用類名調(diào)用靜態(tài)方法sleep:zZ@#ZZZ...用對(duì)象名調(diào)用類方法eat:JennyMale19用對(duì)象名調(diào)用類方法run:<class'__main__.Person'>用對(duì)象名調(diào)用靜態(tài)方法sleep:zZ@#zzz...用對(duì)象名調(diào)用實(shí)例方法show:JennyMale195.1類和對(duì)象5.2.1封裝的概念封裝實(shí)際上有兩個(gè)方面的含義:把該隱藏的隱藏起來(lái),把該暴露的暴露出來(lái)。由于Python并沒(méi)有提供類似于其他程序語(yǔ)言的private等的修飾符,因此Python并不能真正支持隱藏。Python中的封裝有兩種方法:1)用私有變量、私有方法實(shí)現(xiàn)封裝。2)用@property裝飾器定義屬性實(shí)現(xiàn)封裝。5.2.2用私有變量、私有方法實(shí)現(xiàn)封裝Python不能真正支持隱藏。為了隱藏類中的成員,Python行業(yè)建議將類的成員命名為以雙下畫(huà)線開(kāi)頭,這樣程序員在看到雙下劃線開(kāi)頭的屬性時(shí),就知道是隱藏屬性,也就不在外部訪問(wèn)了。5.2類的封裝【例5-14】定義長(zhǎng)方形類Rectangle,在構(gòu)造方法中設(shè)置私有實(shí)例變量寬__width和高_(dá)_height。分別對(duì)寬、高定義get方法、set方法、del方法。再定義一個(gè)計(jì)算面積的方法area()。classRectangle:#定義長(zhǎng)方形類

def__init__(self,width=0,height=0):#定義構(gòu)造方法

self.__width=width#創(chuàng)建實(shí)例變量,寬

self.__height=height#創(chuàng)建實(shí)例變量,高

defgetwidth(self):#定義getwidth()方法,返回寬

returnself.__widthdefsetwidth(self,width):#定義setwidth()方法,設(shè)置寬

self.__width=widthdefdelwidth(self):#定義delwidth()方法

self.__width=0defgetheight(self):#定義getheight()方法,返回高

returnself.__heightdefsetheight(self,height):#定義setheight()方法,設(shè)置高

self.__height=heightdefdelheight(self):#定義delheight()方法

self.__height=0

5.2類的封裝5.2類的封裝defarea(self):#定義計(jì)算面積的方法area()returnself.__width*self.__height#按設(shè)置的寬、高計(jì)算面積rect=Rectangle()#創(chuàng)建對(duì)象,用默認(rèn)值初始化實(shí)例rect.setwidth(20)#設(shè)置寬rect.setheight(30)#設(shè)置高print(rect.getwidth())#得到寬print(rect.getheight())#得到高print(rect.area())#計(jì)算面積運(yùn)行結(jié)果如下:20306005.2類的封裝5.2.3用@property裝飾器定義屬性實(shí)現(xiàn)封裝1.用@property裝飾器定義屬性(推薦)定義方法時(shí),使用@property裝飾器可以把一個(gè)實(shí)例方法變成其同名屬性,以支持“對(duì)象名.屬性名”的訪問(wèn)。用@property定義屬性的語(yǔ)法格式如下:@property#定義只讀屬性def屬性名(self)

代碼塊1@屬性名.setter#定義可修改屬性def屬性名(self,value):

代碼塊2@屬性名.deleter#定義刪除屬性def屬性名(self):

代碼塊3【例5-15】把例5-14改成用@property裝飾器定義屬性。classRectangle:#定義長(zhǎng)方形類

def__init__(self,width=0,height=0):#定義構(gòu)造方法

self.__width=width#創(chuàng)建實(shí)例變量,寬

self.__height=height#創(chuàng)建實(shí)例變量,高

@propertydefwidth(self):#定義只讀屬性width,返回寬

returnself.__width@width.setterdefwidth(self,width):#定義設(shè)置屬性width,設(shè)置寬

self.__width=width@width.deleterdefwidth(self):#定義刪除屬性widthself.__width=0@propertydefheight(self):#定義只讀屬性height,返回高

returnself.__height5.2類的封裝@height.setterdefheight(self,height):#定義設(shè)置屬性height,設(shè)置高

self.__height=height@height.deleterdefheight(self):#定義刪除屬性heightself.__height=0defarea(self):#定義計(jì)算面積的方法area()returnself.__width*self.__height#按設(shè)置的寬、高計(jì)算面積rect=Rectangle()#創(chuàng)建對(duì)象,用默認(rèn)值初始化實(shí)例rect.width=20#用屬性設(shè)置寬rect.height=30#用屬性設(shè)置高print("rect.width=",rect.width)#得到寬print("rect.height=",rect.height)#得到高print("rect.area()=",rect.area())#計(jì)算面積print(rect._Rectangle__width)#訪問(wèn)私有變量運(yùn)行程序的結(jié)果如下:rect.width=20rect.height=30rect.area()=600205.2類的封裝5.2類的封裝【例5-16】對(duì)設(shè)定的屬性值進(jìn)行數(shù)據(jù)校驗(yàn),并給出相應(yīng)的提示。classStudent(object):def__init__(self,name,age):self._name=nameself._age=ageself._weight=45@propertydefname(self):returnself._name@name.setterdefname(self,value):iftype(value)==str:self._name=valueelse:self._name='Noname.'@propertydefage(self):returnself._age5.2類的封裝@age.setterdefage(self,value):ifvalue>0andvalue<100:self._age=valueelse:self._age='invalidagevalue.'@propertydefweight(self):returnself._weight@weight.setterdefweight(self,value):self._weight=value;t=Student('Tom',19)print('Name:',)print('Age:',t.age)print('weight:',t.weight)print('-'*50)='Jack't.age=300t.weight=50print('Name:',)print('Age:',t.age)print('weight:',t.weight)運(yùn)行結(jié)果如下:Name:TomAge:19weight:45--------------------------------------------------Name:JackAge:invalidagevalue.weight:505.2類的封裝2.用property()函數(shù)定義屬性用property()函數(shù)定義屬性的語(yǔ)法格式如下:屬性名=property(get方法名,set方法名,del方法名,'描述信息')【例5-17】如下程序中,使用property()函數(shù)定義一個(gè)width屬性,在定義該屬性時(shí)傳入4個(gè)參數(shù),設(shè)置該屬性可讀、可寫(xiě)、可刪除,也有說(shuō)明文檔。classRectangle:#定義長(zhǎng)方形類

def__init__(self,width=0,height=0):#定義構(gòu)造方法

self._width=width#創(chuàng)建實(shí)例變量,寬

self._height=height#創(chuàng)建實(shí)例變量,高

defgetwidth(self):#定義getwidth()方法,返回寬

returnself._widthdefsetwidth(self,width):#定義setwidth()方法,設(shè)置寬

self._width=widthdefdelwidth(self):#定義delwidth()方法

self._width=0width=property(getwidth,setwidth,delwidth,'矩形的寬屬性')#使用property定義width屬性5.2類的封裝defgetheight(self):#定義getsize()方法,返回高

returnself._heightdefsetheight(self,height):#定義setheight()方法,設(shè)置高

self._height=heightdefdelheight(self):#定義delheight()方法

self._height=0height=property(getheight,setheight,delheight,'矩形的高屬性')#使用property定義height屬性

defarea(self):#定義計(jì)算面積的方法area()returnself._width*self._height#按設(shè)置的寬、高計(jì)算面積print("訪問(wèn)width屬性的說(shuō)明文檔:",Rectangle.width.__doc__)#訪問(wèn)width屬性的說(shuō)明文檔print("通過(guò)內(nèi)置的help()函數(shù)查看Rectangle.width的說(shuō)明文檔:")help(Rectangle.width)#通過(guò)內(nèi)置的help()函數(shù)查看Rectangle.width的說(shuō)明文檔rect=Rectangle(10,20)#創(chuàng)建對(duì)象,并初始化實(shí)例print('rect.width=',rect.width)#訪問(wèn)rect的width屬性rect.width=30#對(duì)rect的width屬性賦值print('rect._width=',rect._width)#訪問(wèn)rect的_width實(shí)例變量print('rect._height=',rect._height)#訪問(wèn)rect的_height實(shí)例變量print('rect.area()=',rect.area())#計(jì)算面積5.2類的封裝delrect.width#刪除rect的width屬性print('rect._width=',rect._width)#訪問(wèn)rect的_width實(shí)例變量print('rect._height=',rect._height)#訪問(wèn)rect的_height實(shí)例變量print('rect.area()=',rect.area())#計(jì)算面積運(yùn)行結(jié)果如下:訪問(wèn)width屬性的說(shuō)明文檔:矩形的寬屬性通過(guò)內(nèi)置的help()函數(shù)查看Rectangle.width的說(shuō)明文檔:Helponproperty:

矩形的寬屬性rect.width=10rect._width=30rect._height=20rect.area()=600rect._width=0rect._height=20rect.area()=05.2類的封裝【例5-18】用屬性方法實(shí)現(xiàn)例5-16。classStudent:def__init__(self,name,age):self._name=nameself._age=ageself._weight=45defget_name(self):returnself._namedefset_name(self,value):iftype(value)==str:self._name=valueelse:self._name='Noname'name=property(fget=get_name,fset=set_name,fdel=None,doc='nameofanstudent')defget_age(self):returnself._age5.2類的封裝defset_age(self,value):ifvalue>0andvalue<100:self._age=valueelse:self._age='invalidagevalue.'age=property(fget=get_age,fset=set_age,fdel=None,doc='ageofanstudent')defget_weight(self):returnself._weightdefset_weight(self,value):self._weight=valueweight=property(fget=get_weight,fset=set_weight,fdel=None,doc='weightofanstudent')t=Student('Tom',19)print('Name:',)print('Age:',t.age)print('weight:',t.weight)print('-'*50)='Jack't.age=300t.weight=505.2類的封裝print('Name:',)print('Age:',t.age)print('weight:',t.weight)print(S.__doc__)運(yùn)行結(jié)果如下:Name:TomAge:19weight:45--------------------------------------------------Name:JackAge:invalidagevalue.weight:50nameofanstudent5.3類的繼承5.3.1繼承的概念所謂繼承就是使用已存在的類的定義作為基礎(chǔ)建立新類的技術(shù)。已存在的類稱為基類、父類或超類(BaseClass、FatherClass、SuperClass)。新建的類稱為派生類(DerivedClass)或子類(SubClass)。通過(guò)繼承,一個(gè)新建子類從已有的父類那里獲得父類的特性和行為。5.3.2使用繼承子類繼承父類的語(yǔ)法格式如下:class子類名(父類名1,父類名2,…):[類變量=值][def__init__(self,參數(shù)表):

方法體1][def方法名(self,參數(shù)表):

方法體2]

類的成員1

類的成員2…5.3類的繼承【例5-19】子類調(diào)用父類的公有變量和方法示例。classFather:#定義父類

car=3#定義類變量,公有的屬性

defdrive(self):#定義方法,公有的方法

print('Fathercandriveacar!')classSon(Father):#子類繼承父類

pass#空語(yǔ)句tom=Father()#父類創(chuàng)建對(duì)象print(tom.car)#父類對(duì)象調(diào)用自己的類變量tom.drive()#父類對(duì)象調(diào)用自己的方法print('-'*50)#顯示50個(gè)“-”jerry=Son()#子類創(chuàng)建對(duì)象print(jerry.car)#子類調(diào)用父類的類變量jerry.drive()#子類調(diào)用父類的方法運(yùn)行結(jié)果如下:3Fathercandriveacar!--------------------------------------------------3Fathercandriveacar!5.3類的繼承5.3.3重寫(xiě)方法如果父類的某些方法不能滿足子類的需求,可以在子類中對(duì)父類的方法進(jìn)行選擇性的修改,包括形參、方法體、返回值等,甚至覆蓋(全部修改),稱為重寫(xiě)方法或方法的重寫(xiě)。1.構(gòu)造方法的重寫(xiě)若要在子類中調(diào)用父類的構(gòu)造方法,就要在子類的構(gòu)造方法中顯式調(diào)用父類的構(gòu)造方法,有兩種方式。1)Python3以前版本的調(diào)用語(yǔ)法為:ParentClassName.__init__(self,parameters)2)Python3的調(diào)用語(yǔ)法為:super().__init__(parameters)建議使用Python3的調(diào)用語(yǔ)法,因?yàn)樗梢越鉀Q類名變動(dòng)后引起的修改問(wèn)題。5.3類的繼承【例5-20】在子類的構(gòu)造方法中調(diào)用父類構(gòu)造方法示例。classFather(object):def__init__(self,name,age):=name#父類的實(shí)例變量不能定義為私有(如__name),否則不能繼承

self.age=agedefdrive(self):#定義方法,公有的方法

print('Fathercandriveacar!')classSon(Father):def__init__(self,name,age,weight):#先繼承,再重構(gòu)

#Father.__init__(self,name,age)#經(jīng)典類繼承父類的構(gòu)造方法

super().__init__(name,age)#新式類繼承父類的構(gòu)造方法

self.weight=weight#定義類的本身屬性

defwalk(self):print('Soniswalking...')defdisplay(self):print(,self.age,self.weight)#、self.age繼承父類jerry=Son('Jerry',19,50)#創(chuàng)建對(duì)象并初始化print(,jerry.age,jerry.weight)#顯示屬性值jerry.drive()#子類對(duì)象調(diào)用父類方法jerry.walk()#子類對(duì)象調(diào)用自己的方法jerry.display()運(yùn)行結(jié)果如下:Jerry1950Fathercandriveacar!Soniswalking...Jerry19505.3類的繼承2.方法的重寫(xiě)在子類中調(diào)用父類的實(shí)例方法有3種方式。1)用父類名調(diào)用,要傳遞self參數(shù);調(diào)用本類的實(shí)例成員時(shí)不需要加self參數(shù)。語(yǔ)法格式為:父類名.父類的方法名(self,參數(shù)列表)2)用當(dāng)前類名調(diào)用,語(yǔ)法格式為:super(當(dāng)前類名,self).父類的方法名(參數(shù)列表)3)最新語(yǔ)法,不用寫(xiě)類名。建議使用本方法。語(yǔ)法格式為:super().父類的方法名(參數(shù)列表)5.3類的繼承【例5-21】子類重寫(xiě)父類的方法示例。classFather:#定義父類

defdrive(self):#定義方法,公有的方法

print('Fathercandriveacar!')classSon(Father):#子類繼承父類

defdrive(self):#重寫(xiě)父類的方法drive(),方法的參數(shù)列表與父類的可以不相同

print('Soncandriveasportscar!')#跑車(chē)

super().drive()#在子類中直接調(diào)用父類的方法drive()tom=Father()#父類創(chuàng)建對(duì)象tom.drive()#父類對(duì)象調(diào)用自己的方法jerry=Son()#子類創(chuàng)建對(duì)象jerry.drive()#子類調(diào)用自己的方法程序運(yùn)行結(jié)果如下:Fathercandriveacar!Soncandriveasportscar!Fathercandriveacar!5.3類的繼承5.3.4派生屬性或方法在父類中沒(méi)有的屬性或方法,如果在子類中定義了,這樣的屬性或方法就叫作派生屬性或派生方法。派生屬性或方法其實(shí)就是在子類中增加自己的屬性或方法。【例5-23】并在子類中派生屬性和方法。classPerson(object):#定義父類

def__init__(self,name,gender,age):=nameself.gender=genderself.age=ageclassStudent(Person):#Student繼承Personid='1000'#在子類中增加類變量

defget_id(self):#在子類中增加實(shí)例方法

returnself.iddefshow(self,credit):#在子類中增加實(shí)例方法

self.credit=sum(credit)#計(jì)算學(xué)分列表的和

id=self.get_id()#在類的內(nèi)部調(diào)用實(shí)例方法

str='Studentname:{},gender:{},age:{},credit:{},id:{}'.format(,self.gender,self.age,self.credit,id)returnstr5.3類的繼承if__name__=='__main__':jenny=Student("Jack",19,"boy")#子類Student創(chuàng)建對(duì)象,執(zhí)行子類自己的構(gòu)造方法

credits=[5,10,20,8,10,8,20,15,30,10,20,30]print(jenny.show(credits))運(yùn)行結(jié)果如下:Studentname:Jack,gender:19,age:boy,credit:186,id:10005.3類的繼承【例5-24】用繼承關(guān)系定義校園中的人員類,包括教師、學(xué)生。分析:由于教師、學(xué)生等人員有許多共同的屬性和方法,所以可以把共同的屬性和方法定義為父類(人員類Person),然后派生出教師類Teacher、學(xué)生類Student。如下程序。classPerson:#定義父類

def__init__(self,name,age,addr,hoppy):=name#姓名

self.age=age#年齡

self.addr=addr#地址

self.hoppy=hoppy#愛(ài)好

deftell(self):print('姓名:%s,年齡:%s,地址:%s,愛(ài)好:%s'%(,self.age,self.addr,self.hoppy))classTeacher(Person):#定義子類

def__init__(self,name,age,addr,hoppy,salary):super().__init__(name,age,addr,hoppy)#在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法

self.salary=salary#月薪

deftell(self):#重寫(xiě)方法

Person.tell(self)#在子類中直接調(diào)用父類的方法tell()print('我的月薪是:%s'%self.salary)5.3類的繼承classStudent(Person):#定義子類

def__init__(self,name,age,addr,hoppy,marks):Person.__init__(self,name,age,addr,hoppy)#在子類的構(gòu)造方法中調(diào)用父類的構(gòu)造方法

self.marks=marks#成績(jī)

deftell(self):#重寫(xiě)方法

super().tell()#在子類中直接調(diào)用父類的方法tell()print('我的成績(jī)是:%d'%self.marks)t=Teacher('王剛','45','北京','旅游',8000)#創(chuàng)建教師對(duì)象,并初始化對(duì)象t.tell()#調(diào)用教師對(duì)象的方法s=Student('李芳',18,'上海','美食',95)s.tell()程序運(yùn)行結(jié)果為:姓名:王剛,年齡:45,地址:北京,愛(ài)好:旅游我的月薪是:8000姓名:李芳,年齡:18,地址:上海,愛(ài)好:美食我的成績(jī)是:955.3類的繼承【例5-25】例5-24用屬性實(shí)現(xiàn)。classPerson:#定義父類

def__init__(self,name,age):self.__name=name#姓名

self.__age=age#年齡

@propertydefname(self):#定義只讀屬性namereturnself.__name#類內(nèi)訪問(wèn)實(shí)例變量

@name.setterdefname(self,name):#定義設(shè)置屬性nameself.__name=nam

溫馨提示

  • 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)論