《大數(shù)據(jù)的Python基礎(chǔ)》課件-第6章 面向?qū)ο蟪绦蛟O(shè)計_第1頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第6章 面向?qū)ο蟪绦蛟O(shè)計_第2頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第6章 面向?qū)ο蟪绦蛟O(shè)計_第3頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第6章 面向?qū)ο蟪绦蛟O(shè)計_第4頁
《大數(shù)據(jù)的Python基礎(chǔ)》課件-第6章 面向?qū)ο蟪绦蛟O(shè)計_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第6章面向?qū)ο蟪绦蛟O(shè)計學(xué)習(xí)目標(biāo)

掌握類與對象編程方法

了解類中各類數(shù)據(jù)成員和方法成員的使用

掌握繼承和多態(tài)

了解常用特殊方法22025/3/66.1類與對象

對象(Object)表示現(xiàn)實世界中的特定實體類是Python語言的核心,在Python中各種數(shù)據(jù)類型都是類,而對象則是實例化和具體化的類。32025/3/66.1.1創(chuàng)建類和對象定義一個類:Python使用class關(guān)鍵字來定義類,class關(guān)鍵字之后是一個空格,然后是類的名字,再然后是一個冒號,最后換行并定義類的內(nèi)部實現(xiàn)。

類名首字母一般采取大寫的方式,但也可根據(jù)需要自行設(shè)定命名規(guī)范。42025/3/6>>>classCar: defgetInfo(self): print('Thisisacar')6.1.1創(chuàng)建類和對象實例化對象

在類名后添加一個括號用于實例化該類。

通過“對象名.成員”的方式來訪問其中的成員屬性或成員方法。52025/3/6>>>car=Car()>>>car.getInfo()Thisisacar>>>isinstance(car,Car)True>>>isinstance(car,tuple)False6.1.2構(gòu)造方法

類中的函數(shù)稱為該類的方法,其中__ini()__,開頭和結(jié)尾各有一對下劃線,稱為構(gòu)造方法,在實例化類的時候被自動調(diào)用。62025/3/6>>>classCar: def__init__(self,color,model): print('Thecoloris%sandthemodelis%s'%(color,model))

defgetInfo(self): print('Thisisacar')

>>>a=Car('red','audi')Thecolorisredandthemodelisaudi6.1.3實例成員

一個實例化對象的成員是指它的數(shù)據(jù)和方法。

實例的數(shù)據(jù)保存在該實例的成員變量中,用于表示該實例的屬性。

對于一個實例化對象,可以使用圓點運算符“.”來使用其成員變量和成員方法,又稱對象訪問,使用形式為“對象名.實例成員”。72025/3/66.1.3實例成員getInfo(self)方法就是一個實例方法,實例方法具有如下性質(zhì):

實例方法在定義時一般將self作為第一個輸入?yún)?shù)。

實例方法可以在該類的其它實例方法中調(diào)用,具體方法為“self.實例方法名(參數(shù))”。

實例方法可以在類的實例化對象中進行訪問,具體形式為“對象名.實例方法名(參數(shù))”。82025/3/66.1.3實例成員

在實例方法中定義的實例變量,在定義時以self作為前綴。實例變量具有以下性質(zhì):

實例變量在類的實例方法中定義,定義時以“self.實例變量名”的形式。實例變量可以在類的實例化對象中進行訪問,訪問時的形式為“對象名.實例變量名”。實例變量可以在其所在類的實例方法中進行訪問,但必須保證訪問之前已經(jīng)對該實例變量進行。初值的設(shè)定,一般應(yīng)在構(gòu)造方法中初始化各種實例變量。92025/3/6【例6-1】定義和使用一個汽車類102025/3/6classCar:def__init__(self,color,model):self.color=color

self.setModel(model)

=''

defgetInfo(self):msg='Thecoloris'+self.color+'andthemodelis'+self.modelmsg+=',thenameis'+print(msg)

defsetPrice(self):

pass

defsetName(self,name):=name

defsetModel(self,model):self.model=model6.1.3實例成員112025/3/6>>>a=Car('red','audi') >>>a.getInfo() Thecolorisredandthemodelisaudi,thenameis>>>print(a.color)red>>>print(a.model)audi>>>a.setName('Babi')>>>a.color='blue'>>>a.model='bmw'>>>a.getInfo()Thecolorisblueandthemodelisbmw,thenameisBabi6.2封裝

封裝(Encapsulation)是面向?qū)ο蟮闹饕卣鳎前芽陀^事物抽象并封裝成對象,將數(shù)據(jù)成員、方法等集合在一個整體內(nèi)。

完成封裝的對象,可以實現(xiàn)信息的隱藏,只允許可信的對象訪問和操作隱藏的內(nèi)部數(shù)據(jù),而其公有數(shù)據(jù)則不受這種限制。

采用封裝思想所建立的類實現(xiàn)了數(shù)據(jù)和方法的統(tǒng)一管理,使用者無需關(guān)心方法在類內(nèi)部的具體實現(xiàn),只需要直接使用類的方法。122025/3/66.2.1類的數(shù)據(jù)成員

類的數(shù)據(jù)成員是類固有的特征,代表了一類對象的公共性質(zhì)。

類的數(shù)據(jù)成員根據(jù)其特點可以分為兩種,一種是為類建立的數(shù)據(jù)成員,它是在所有方法之外所定義的屬性,即類屬性,從變量的角度看這種變量叫做類變量。

類變量屬于整個類,不是某個實例的一部分,而是所有實例之間共享的公共屬性。對類變量的引用一般采用“類名.類變量名”的方式。132025/3/66.2.1類的數(shù)據(jù)成員

另一種是在實例方法中定義的成員屬性,在定義時以self作為前綴,即實例變量,一般要求在類的實例對象中引用。142025/3/6>>>classStudent:course=''

def__init__(self,name,age):=name

self.age=age

>>>a=Student('Zhang',20)>>>b=Student('Wang',21)>>>Student.course='math'>>>print(,a.age,Student.course)Zhang20math>>>print(,b.age,b.math)Wang21math6.2.2類的方法成員

類的方法成員包括實例方法、類方法和靜態(tài)方法三種類型。實例方法實例方法的第一個參數(shù)為self,可以引用類的實例變量,但它不能引用類變量。要實現(xiàn)對類變量的引用,就需要采用類方法。152025/3/66.2.2類的方法成員類方法

類本身的方法就是類方法。類方法不對特定實例進行操作,在類方法中也不能訪問實例變量。

類方法通過修飾符@classmethod來定義,方法的第一個形式參數(shù)一般需要設(shè)置為cls。162025/3/6@classmethoddefshowCourse(cls):print('Thecourseis',cls.course)6.2.2類的方法成員

類方法一般需要類名來訪問,也可以通過對象實例來調(diào)用。172025/3/6>>>a=Student('Zhang',20)>>>Student.course='math'>>>a.showCourse()Thecourseismath>>>Student.showCourse()Thecourseismath6.2.2類的方法成員靜態(tài)方法

Python允許在類中聲明與類的對象實例無關(guān)的方法,稱為靜態(tài)方法。

靜態(tài)方法只是名義上歸屬類管理,并不能使用類變量和實例變量。

在聲明時,靜態(tài)方法需要采用修飾符@staticmethod加以說明。

靜態(tài)方法一般采用類名來引用,也可以利用實例對象名來引用靜態(tài)方法。182025/3/6【例6-2】定義和使用一個學(xué)生類192025/3/6classStudent:course=''

def__init__(self,name,age):=nameself.age=age

@classmethod#類方法defshowCourse(cls):print('Thecourseis',cls.course)print(cls.getAverage(4,5,6),Student.getAverage(4,5,6))

defsetScore(self,score):self.score=score

@staticmethod#靜態(tài)方法defgetAverage(a,b,c):return(a+b+c)/3

【例6-2】定義和使用一個學(xué)生類202025/3/6程序的運行結(jié)果如下:Thecourseismath5.05.070.0Intest():mathThecourseismath5.05.02.0deftest(self):print('Intest():',Student.course)Student.showCourse()print(Student.getAverage(1,2,3))

a=Student('Zhang',20)b=Student('Wang',21)Student.course='math'a.showCourse()print(a.getAverage(60,70,80))a.test()6.2.3訪問控制Python中一般的成員變量和成員方法都是公有成員,沒有特殊的訪問限制,可以直接用實例對象名加圓點運算符的形式對成員進行引用。Python采取變量名稱約定的方式實現(xiàn)訪問控制,類的成員一般為公有成員,如果名稱的首部有下劃線,就會改變其訪問限制屬性。212025/3/66.2.3訪問控制222025/3/6

以單下劃線開始的成員為保護成員,形式如_var,只有類實例和子類實例能訪問到這些成員,不能用‘frommoduleimport*’導(dǎo)入的方式來訪問。

以雙下劃線開始的成員是私有成員,形式如__var,意思是只能在類內(nèi)部的方法中使用,即便是子類的方法也不能訪問到這個成員。

Python中一般的成員變量和成員方法都是公有成員,沒有特殊的訪問限制,可以直接用實例對象名加圓點運算符的形式對成員進行引用。【例6-3】定義和使用一個人員類232025/3/6classPerson:def__init__(self,name,age):=nameself.age=ageself._career=''

self.__money=0 defintroduce(self):print("我的名字{},年齡{}".format(,self.age))defgetMoney(self):returnself.__moneydefsetMoney(self,money):self.__money=moneydef_buy(self,cost):if(self.__evaluate(cost)): 【例6-3】定義和使用一個人員類242025/3/6print('完成購買')returnprint('無法購買')

def__evaluate(self,cost):if(cost>self.__money):

returnFalseself.__money-=costreturnTrue【例6-3】定義和使用一個人員類252025/3/6>>>a=Person(name='張三',age=20)>>>roduce() 我的名字張三,年齡20>>>a._career='會計'

>>>a.setMoney(100)>>>print(a._career)會計>>>a._buy(5)

完成購買>>>print(a.getMoney())956.2.4屬性

一個成員變量設(shè)置為公有,可以直接讀取、修改該變量。

私有成員變量可以設(shè)置getter和setter的方法,實現(xiàn)對私有成員變量的使用。

為私有成員變量設(shè)置只讀、修改或刪除屬性,可達到對私有成員變量進行相應(yīng)操作的目的。

可以通過為方法添加@property修飾符來聲明屬性的只讀權(quán)限,利用@屬性名.setter來修飾可修改權(quán)限,通過@屬性名.deleter來修飾屬性的可刪除權(quán)限。

不設(shè)置可刪除權(quán)限的修飾符及其相關(guān)方法,則原有變量會默認具有不可刪除的權(quán)限。262025/3/6【例6-4】定義和使用一個用于演示類訪問控制的人員類272025/3/6classPerson:def__init__(self,name,age):=nameself.age=ageself._career=''

self.__money=0 defintroduce(self):print("我的名字{},年齡{}".format(,self.age))

@property

defmoney(self):returnself.__money【例6-4】定義和使用一個用于演示類訪問控制的人員類282025/3/6@money.setter

defmoney(self,money):self.__money=money

def_buy(self,cost):if(self.__evaluate(cost)):print('完成購買')returnprint('無法購買')

def__evaluate(self,cost):if(cost>self.__money):returnFalseself.__money-=costreturnTruea=Person(name='張三',age=20) #類的實例化roduce()a._career='會計' a.money=50print(a.money)print(a._career)a._buy(5)print(a.money)【例6-4】定義和使用一個用于演示類訪問控制的人員類

要增加可刪除屬性,可在類中添加以下代碼。

用于定義屬性的另一種方法是采用property_name=property(fget=get_name,fset=

set_name,fdel=del_name,doc='')

函數(shù)的方案,這一方法無需設(shè)置屬性的修飾符,只需在property()函數(shù)中聲明屬性的各個權(quán)限所對應(yīng)的方法,若不需要設(shè)置該權(quán)限可以將方法設(shè)置為None。292025/3/6

@money.deleter defmoney(self):delself.__money6.2.5動態(tài)成員綁定

對象的成員方法一般在其類的設(shè)計時直接建立。

在某些情況下,可能會需要在運行時為對象動態(tài)添加成員,這使得類的實現(xiàn)更加靈活,也比較符合現(xiàn)實世界中對象的屬性和活動可能隨著時間改變的特性。302025/3/6【例6-5】用于演示采用類的動態(tài)成員方法綁定的汽車類312025/3/6classCar:def__init__(self,color,model):self._color=color

self.model=modelself.__name=''defgetInfo(self):msg='Thecoloris'+self._color+'andthemodelis'+self.modelmsg+=',thenameis'+self.__nameprint(msg)defsetName(self,name):self.__name=nameimporttypesdefsetSpeed(self,speed):self.speed=speed【例6-5】用于演示采用類的動態(tài)成員方法綁定的汽車類322025/3/6print(a.speed)#print(c.speed) #會報錯誤信息AttributeError:'Car'objecthasnoattribute'speed'b.setSpeed=types.MethodType(setSpeed,Car)b.setSpeed(60)print(b.speed)print(c.speed) #因綁定了類,此處工作正常程序運行結(jié)果如下:606060a=Car('red','audi')b=Car('blue','bmw')c=Car('yellow','benz')a.setSpeed=types.MethodType(setSpeed,a)a.setSpeed(60)6.2.5動態(tài)成員綁定332025/3/6>>>a.length=5 #為實例a動態(tài)添加一個車體長度length的實例變量>>>print(a.length)5>>>print(b.length) #實例b并不具備新添加的length屬性AttributeError:'Car'objecthasnoattribute'length'>>>Car.seat=5 #添加了一個類屬性>>>print(c.seat) #能夠訪問類變屬性56.2.5動態(tài)成員綁定342025/3/6>>>print(a._color) #可以訪問保護成員變量red>>>print(a.__name) #無法訪問私有成員變量AttributeError:'Car'objecthasnoattribute'__name'>>>a.setName('Babi')>>>a.getInfo()Thecolorisredandthemodelisaudi,thenameisBabi>>>a.__name='gimi' #直接設(shè)置a.__name成功執(zhí)行>>>print(a.__name)gimi>>>a.getInfo()Thecolorisredandthemodelisaudi,thenameisBabi >>>print(b.__name)AttributeError:'Car'objecthasnoattribute'__name'6.3繼承和多態(tài)繼承和多態(tài)是面向?qū)ο蟪绦蛟O(shè)計的重要特性,它們?yōu)榇a復(fù)用和程序的功能完善及對多樣本數(shù)據(jù)的處理提供了可能。352025/3/66.3.1繼承

面向?qū)ο蟮囊粋€重要特征就是繼承,它允許一個類繼承另一個已有的設(shè)計良好的類中的成員來充實自己的功能,同時子類也可以對這些功能進行二次開發(fā),從而減少開發(fā)的工作量。

在繼承關(guān)系中,已有的、設(shè)計好的類稱為父類或基類,新設(shè)計的類稱為子類或派生類。派生類可以繼承父類的公有成員,但是不能繼承其私有成員。362025/3/66.3.1繼承object類是所有類的基類,如果要進行類的繼承,其基類應(yīng)聲明為“基類名(object)”的形式,而子類則聲明為“子類名(基類名)”的形式,表示其繼承了該基類。

類可以有一個或多個父類,并從它們那里繼承行為。對類B的實例調(diào)用方法或訪問其屬性時,如果找不到該方法或?qū)傩?,將在其父類A中查找。

若子類定義的成員方法具有與父類相同的名字,即構(gòu)成方法重寫的條件。372025/3/66.3.1繼承382025/3/6>>>classA: defhello(self): print("Hello,I'mA.") defplay(self): print('Ilikeplayingfootball')>>>classB(A):pass>>>b=B()>>>b.hello()Hello,I'mA.>>>classC(A): defhello(self,msg): print("Hello,I'mC.",msg)>>>c=C()>>>c.hello() TypeError:hello()missing1requiredpositionalargument:'msg'>>>c.hello('welcome') Hello,I'mC.welcome>>>c.play()Ilikeplayingfootball6.3.1繼承

子類的構(gòu)造函數(shù)中應(yīng)有調(diào)用父類構(gòu)造函數(shù)的方法

super().__init__(參數(shù)列表)父類名.__init__(

self,參數(shù)列表)392025/3/6【例6-6】一個繼承于人員類的教師類402025/3/6classPerson(object):def__init__(self,name='',age=20,sex='man'):self.setName(name)self.setAge(age)self.setSex(sex)print('Person',self.__name,'initialized')defsetName(self,name):if(notisinstance(name,str)):print('namemustbestring.')self.__name=namedefsetAge(self,age):if(notisinstance(age,int)):print('agemustbeinteger.')self.__age=agedefsetSex(self,sex):if(notsexin('man','woman')):print('sexmustbe"man"or"woman"')self.__sex=''returnself.__sex=sexdefshow(self):print('Name:',self.__name)print('Age:',self.__age)print('Sex:',self.__sex)【例6-6】一個繼承于人員類的教師類412025/3/6classTeacher(Person):#派生類def__init__(self,name='',age=30,sex='man',department='Computer'):super().__init__(name,age,sex)#也可以使用下面的形式對基類數(shù)據(jù)成員進行初始化#Person.__init__(self,name,age,sex)self.setDepartment(department)

defsetDepartment(self,department):self.__department=department

defshow(self):super().show()print('Department:',self.__department)

【例6-6】一個繼承于人員類的教師類422025/3/6if__name__=='__main__': print('='*30)p=Person('ZhangSan',19,'man')p.show()print('='*30)t=Teacher('LiSi',32,'man','Math')t.show()程序運行結(jié)果如下:==============================sexmustbe"man"or"woman"PersonZhangSaninitializedName:ZhangSanAge:19Sex:==============================PersonLiSiinitializedName:LiSiAge:32Sex:manDepartment:Math6.3.2多態(tài)

多態(tài)(Polymorphism),意思是多種樣式,在繼承關(guān)系中引入多態(tài),使得Python可以在運行時根據(jù)引用實例的不同而執(zhí)行不同的行為,調(diào)用對應(yīng)的方法。

多態(tài)往往會對應(yīng)于一個統(tǒng)一的接口,但由于傳入的類型不同而產(chǎn)生不同的執(zhí)行效果。

432025/3/6【例6-7】動物吠叫的多態(tài)實現(xiàn)方法示例442025/3/6classAnimal(object):def__init__(self,name):=nameprint('%sinitialized'%)

defbark(self): print(,'叫')defanimal_bark(obj):

obj.bark()classCat(Animal):def__init__(self,name):super().__init__(name)【例6-7】一個繼承于人員類的教師類452025/3/6defbark(self):print('%s:喵喵喵!'%)classDog(Animal):

defbark(self):print('%s:汪!汪!汪!'%)

deffunc(animal):

animal.bark()

a=Cat('cat')b=Dog('dog')c=Animal('animal')func(a)func(b)func(c)程序運行結(jié)果如下:catinitializeddoginitializedanimalinitializedcat:喵喵喵!dog:汪!汪!汪!animal叫6.4.1常用特殊方法Python類有大量的特殊方法,比較常見的是構(gòu)造函數(shù)和析構(gòu)函數(shù),除此之外,運算符重載就是通過重寫特殊方法實現(xiàn)的。Python中類的構(gòu)造函數(shù)是__init__(),一般用來為數(shù)據(jù)成員設(shè)置初值或進行其他必要的初始化工作,在創(chuàng)建對象時被自動調(diào)用和執(zhí)行。

Python中類的析構(gòu)函數(shù)是__del__(),一般用來釋放對象占用的資源,在Python刪除對象和收回對象空間時被自動調(diào)用和執(zhí)行。462025/3/66.4.1常用特殊方法472025/3/66.4.2運算符重載

運算符重載是讓自定義的類所生成的對象(實例)能夠使用常規(guī)運算符進行操作。

要實現(xiàn)運算符重載需要具備兩個條件,一是找出想要重載的常規(guī)運算符,二是找出該運算符所對應(yīng)的特殊方法名稱。

以加號的重載為例,加號所對應(yīng)的方法__add__(),經(jīng)常在實際使用中被重新定義,用來重載一般意義上的“+”號。482025/3/6【例6-8】一個自定義的數(shù)組492025/3/6classNumArray:'Auser-definedarrayofnumbers(int,float,complex)'def__IsNumber(self,n):returnisinstance(n,(int,float,complex))

def__init__(self,*args):ifnotargs:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論