python多態(tài)的三種表現(xiàn)形式-《Python》面向?qū)ο笕筇匦灾鄳B(tài)、封裝_第1頁
python多態(tài)的三種表現(xiàn)形式-《Python》面向?qū)ο笕筇匦灾鄳B(tài)、封裝_第2頁
python多態(tài)的三種表現(xiàn)形式-《Python》面向?qū)ο笕筇匦灾鄳B(tài)、封裝_第3頁
python多態(tài)的三種表現(xiàn)形式-《Python》面向?qū)ο笕筇匦灾鄳B(tài)、封裝_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、ython_Python向?qū)ο笕匦灾鄳B(tài)、封裝、多態(tài)1、什么是多態(tài)?個類表現(xiàn)出的多種狀態(tài):通過繼承來實現(xiàn)的在Java中的表現(xiàn):在個函數(shù)中需要給參數(shù)指定數(shù)據(jù)類型,如果這個地可以接收兩個以上類型的參數(shù),那么這些類型應(yīng)該有個類,這個類是所有類對象的類型。在Python中:函數(shù)的參數(shù)不需要指定數(shù)據(jù)類型,所以我們也不需要通過繼承的形式來統(tǒng)組類的類型,換句話說:所有的對象其實都是object類型,所有在Python當(dāng)中處處是多態(tài)。#多態(tài)指的是類事物有多種形態(tài)#動物有多種形態(tài):,狗,豬importabcclass Animal(metaclass=abc.ABCMeta): #同類事物:動物abc.abs

2、tractmethoddeftalk(self):passclass People(Animal): #動物的形態(tài)之:deftalk(self):print(say hello)class Dog(Animal): #動物的形態(tài)之:狗deftalk(self):print(say wangwang)class Pig(Animal): #動物的形態(tài)之三:豬deftalk(self):print(say aoao)2、多態(tài)性什么是多態(tài)動態(tài)綁定(在繼承的背景下使時,有時也稱為多態(tài)性)多態(tài)性是指在不考慮實例類型的情況下使實例#在向?qū)ο蠓ㄖ邪闶沁@樣表述多態(tài)性:#向不同的對象發(fā)送同條消息(obj.fun

3、c():是調(diào)了obj的法func,稱為向obj發(fā)送了條消息func),不同的對象在接收時會產(chǎn)不同的為(即法)。#也就是說,每個對象可以的式去響應(yīng)共同的消息。所謂消息,就是調(diào)函數(shù),不同的為就是指不同的實現(xiàn),即執(zhí)不同的函數(shù)。#如:師.下課鈴響了(),學(xué).下課鈴響了(),師執(zhí)的是下班操作,學(xué)執(zhí)的是放學(xué)操作,雖然者消息樣,但是執(zhí)的效果不同3、鴨類型Python崇尚鴨類型,即“如果看起來像,叫聲像且起路來像鴨,那么它就是鴨”len()# str list tuple dict set range 對于len函數(shù)來說,這些都是鴨類型index()# str list tuple 對于index函數(shù)來說,這

4、些都是鴨類型print() # 對于print來說所有的對象都是鴨類型不是明確的通過繼承實現(xiàn)的多態(tài),是通過個模糊的概念來判斷這個函數(shù)能不能接受這個類型的參數(shù)、封裝概念:隱藏對象的屬性和實現(xiàn)細節(jié),僅對外提供公共訪問式。好處:1、將變化隔離;2、便于使;3、提復(fù)性;4、提安全性;原則:1、將不需要對外提供的內(nèi)容都隱藏起來;2、把屬性都隱藏,提供公共法對其訪問。義上的封裝:(把屬性函數(shù)都放到類)class 類名:def 法1(self):passdef 法2(self):pass是為了只有這個類的對象才能使定義在類中的法狹義上的封裝:(定義私有成員)把個屬性或法藏在類中class Goods:_di

5、scount = 0 # 私有的靜態(tài)變量print(_discount)print(Goods._discount)# 在類的外部不能引私有的靜態(tài)變量類中的靜態(tài)變量和法名在程序加載的過程中就已經(jīng)執(zhí)完了,不需要等待調(diào)在這個類加載完成之前,Goods這個名字還沒有出現(xiàn)在內(nèi)存空間中私有的靜態(tài)屬性可以在類的內(nèi)部使,來隱藏某個變量的值類中的私有成員:1、私有的靜態(tài)屬性2、私有的對象屬性3、私有的法為什么要定義個私有變量?1、我不想讓你看到這個值2、我不想讓你修改這個值3、我想讓你在修改這個值的時候有些限制:保證了數(shù)據(jù)的安全4、有些法或?qū)傩圆幌M活惱^承私有變量和私有法:在Python中雙下劃線開頭的式將

6、屬性隱藏起來(設(shè)置成私有的)#其實這僅僅這是種變形操作#類中所有雙下劃線開頭的名稱如_x都會動變形成:_類名_x的形式:classA:_N=0 #類的數(shù)據(jù)屬性就應(yīng)該是共享的,但是語法上是可以把類的數(shù)據(jù)屬性設(shè)置成私有的如_N,會變形為_A_Ndef _init_(self):self._X=10 #變形為self._A_Xdef _foo(self): #變形為_A_fooprint(from A)defbar(self):self._foo() #只有在類內(nèi)部才可以通過_foo的形式訪問到.#A._A_N是可以訪問到的,即這種操作并不是嚴格意義上的限制外部訪問,僅僅只是種語法意義上的變形這種動

7、變形的特點:1.類中定義的_x只能在內(nèi)部使,如self._x,引的就是變形的結(jié)果。2.這種變形其實正是針對外部的變形,在外部是法通過_x這個名字訪問到的。3.在類定義的_x不會覆蓋在類定義的_x,因為類中變形成了:_類名_x,類中變形成了:_類名_x,即雙下滑線開頭的屬性在繼承給類時,類是法覆蓋的。這種變形需要注意的問題是:1.這種機制也并沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名_屬性,然后就可以訪問了,如a._A_N2.變形的過程只在類的內(nèi)部效,在定義后的賦值操作,不會變形在繼承中,類如果不想讓類覆蓋的法,可以將法定義為私有的#正常情況 classA

8、:.deffa(self):.print(from A).deftest(self):. self.fa(). classB(A):.deffa(self):.print(from B). b=B()b.test()fromB#把fa定義成私有的,即_fa classA:.def _fa(self): #在定義時就變形為_A_fa. print(from A).deftest(self):. self._fa() #只會與所在的類為準(zhǔn),即調(diào)_A_fa. classB(A):.def _fa(self):.print(from B). b=B()b.test()from A封裝與擴展性封裝在于明

9、確區(qū)分內(nèi)外,使得類實現(xiàn)者可以修改封裝內(nèi)的東西不影響外部調(diào)者的代碼;外部使者只知道個接(函數(shù)),只要接(函數(shù))名、參數(shù)不變,使者的代碼永遠需改變。這就提供個良好的合作基礎(chǔ)或者說,只要接這個基礎(chǔ)約定不變,則代碼改變不為慮。#類的設(shè)計者classRoom:def _init_(self,name,owner,width,length,high):=nameself.owner=ownerself._width=widthself._length=lengthself._high=highdef tell_area(self): #對外提供的接,隱藏了內(nèi)部的實現(xiàn)細節(jié),此時我們想求的是積return self._width * self._length#使者 r1=Room(臥室,egon,20,20,20) r1.tell_area() #使者調(diào)接tell_area#類的設(shè)計者,輕松的擴展了功能,類的使者完全不需要改變的代碼classRoom:def _init_(self,name,owner,width,length,high):=nameself.owner=ownerself._width=widthself._length=lengthself._high=highdef tell_area(self): #對外提供的接,隱藏內(nèi)部實現(xiàn)

溫馨提示

  • 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

提交評論