人工智能技術(shù)基礎(chǔ) 課件 模塊7、8 面向?qū)ο蟪绦蛟O(shè)計(jì)、文件_第1頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊7、8 面向?qū)ο蟪绦蛟O(shè)計(jì)、文件_第2頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊7、8 面向?qū)ο蟪绦蛟O(shè)計(jì)、文件_第3頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊7、8 面向?qū)ο蟪绦蛟O(shè)計(jì)、文件_第4頁(yè)
人工智能技術(shù)基礎(chǔ) 課件 模塊7、8 面向?qū)ο蟪绦蛟O(shè)計(jì)、文件_第5頁(yè)
已閱讀5頁(yè),還剩72頁(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ū)ο蟪绦蛟O(shè)計(jì)(ObjectOrientedProgramming,OOP)主要針對(duì)大型軟件設(shè)計(jì)而提出,使得軟件設(shè)計(jì)更加靈活,能夠很好地支持代碼復(fù)用和設(shè)計(jì)復(fù)用,并且使得代碼具有更好的可讀性和可擴(kuò)展性。面向?qū)ο蟪绦蛟O(shè)計(jì)的一條基本原則是計(jì)算機(jī)程序由多個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成,這大大地降低了軟件開發(fā)的難度,使得編程就像搭積木一樣簡(jiǎn)單。面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)關(guān)鍵性觀念是將數(shù)據(jù)以及對(duì)數(shù)據(jù)的操作封裝在一起,組成一個(gè)相互依存、不可分割的整體,即對(duì)象。對(duì)于相同類型的對(duì)象進(jìn)行分類、抽象后,得出共同的特征而形成了類,面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵就是如何合理地定義和組織這些類以及類之間的關(guān)系。面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)Python完全采用了面向?qū)ο蟪绦蛟O(shè)計(jì)的思想,是真正面向?qū)ο蟮母呒?jí)動(dòng)態(tài)編程語(yǔ)言,完全支持面向?qū)ο蟮幕竟δ埽绶庋b、繼承、多態(tài)以及對(duì)基類方法的覆蓋或重寫。Python中對(duì)象的概念很廣泛,Python中的一切內(nèi)容都可以稱為對(duì)象,除了數(shù)字、字符串、列表、元組、字典、集合、range對(duì)象、zip對(duì)象等等,函數(shù)也是對(duì)象,類也是對(duì)象。創(chuàng)建類時(shí)用變量形式表示的對(duì)象屬性稱為數(shù)據(jù)成員,用函數(shù)形式表示的對(duì)象行為稱為成員方法,成員屬性和成員方法統(tǒng)稱為類的成員。7.1.1類定義語(yǔ)法Python使用class關(guān)鍵字來(lái)定義類,class關(guān)鍵字之后是一個(gè)空格,然后是類的名字,再然后是一個(gè)冒號(hào),最后換行并定義類的內(nèi)部實(shí)現(xiàn)。類名的首字母一般要大寫,當(dāng)然也可以按照自己的習(xí)慣定義類名,但一般推薦參考慣例來(lái)命名,并在整個(gè)系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)中保持風(fēng)格一致,這一點(diǎn)對(duì)于團(tuán)隊(duì)合作尤其重要。classCar:

definfor(self):print("Thisisacar")7.1.1類定義語(yǔ)法定義了類之后,可以用來(lái)實(shí)例化對(duì)象,并通過(guò)“對(duì)象名.成員”的方式來(lái)訪問(wèn)其中的數(shù)據(jù)成員或成員方法。>>>car=Car()>>>r()Thisisacar在Python中,可以使用內(nèi)置方法isinstance()來(lái)測(cè)試一個(gè)對(duì)象是否為某個(gè)類的實(shí)例。>>>isinstance(car,Car)True>>>isinstance(car,str)False7.1.1類定義語(yǔ)法Python提供了一個(gè)關(guān)鍵字“pass”,類似于空語(yǔ)句,可以用在類和函數(shù)的定義中或者選擇結(jié)構(gòu)中。當(dāng)暫時(shí)沒(méi)有確定如何實(shí)現(xiàn)功能,或者為以后的軟件升級(jí)預(yù)留空間,或者其他類型功能時(shí),可以使用該關(guān)鍵字來(lái)“占位”。>>>classA:

pass>>>defdemo():

pass>>>if5>3:

pass7.1.2self參數(shù)類的所有實(shí)例方法都必須至少有一個(gè)名為self的參數(shù),并且必須是方法的第一個(gè)形參(如果有多個(gè)形參的話),self參數(shù)代表將來(lái)要?jiǎng)?chuàng)建的對(duì)象本身。在類的實(shí)例方法中訪問(wèn)實(shí)例屬性時(shí)需要以self為前綴。在外部通過(guò)對(duì)象名調(diào)用對(duì)象方法時(shí)并不需要傳遞這個(gè)參數(shù)。如果在外部通過(guò)類名調(diào)用對(duì)象方法則需要顯式為self參數(shù)傳值。7.1.2self參數(shù)在Python中,在類中定義實(shí)例方法時(shí)將第一個(gè)參數(shù)定義為“self”只是一個(gè)習(xí)慣,而實(shí)際上類的實(shí)例方法中第一個(gè)參數(shù)的名字是可以變化的,而不必須使用“self”這個(gè)名字,盡管如此,建議編寫代碼時(shí)仍以self作為方法的第一個(gè)參數(shù)名字。>>>classA:

def__init__(hahaha,v):

hahaha.value=v

defshow(hahaha):

print(hahaha.value)>>>a=A(3)>>>a.show()37.1.3類成員與實(shí)例成員屬于實(shí)例的數(shù)據(jù)成員一般是指在構(gòu)造函數(shù)__init__()中定義的,定義和使用時(shí)必須以self作為前綴;屬于類的數(shù)據(jù)成員是在類中所有方法之外定義的。在主程序中(或類的外部),實(shí)例屬性屬于實(shí)例(對(duì)象),只能通過(guò)對(duì)象名訪問(wèn);而類屬性屬于類,可以通過(guò)類名或?qū)ο竺伎梢栽L問(wèn)。7.1.3類成員與實(shí)例成員在實(shí)例方法中可以調(diào)用該實(shí)例的其他方法,也可以訪問(wèn)類屬性以及實(shí)例屬性。在Python中比較特殊的是,可以動(dòng)態(tài)地為類和對(duì)象增加成員,這一點(diǎn)是和很多面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言不同的,也是Python動(dòng)態(tài)類型特點(diǎn)的一種重要體現(xiàn)。7.1.3類成員與實(shí)例成員classCar:price=100000#定義類屬性

def__init__(self,c):self.color=c#定義實(shí)例屬性car1=Car("Red")#實(shí)例化對(duì)象car2=Car("Blue")print(car1.color,Car.price)#查看實(shí)例屬性和類屬性的值Car.price=110000#修改類屬性C='QQ'#動(dòng)態(tài)增加類屬性car1.color="Yellow"#修改實(shí)例屬性print(car2.color,Car.price,C)print(car1.color,Car.price,C)7.1.3類成員與實(shí)例成員importtypesdefsetSpeed(self,s):self.speed=scar1.setSpeed=types.MethodType(setSpeed,car1)#動(dòng)態(tài)增加成員方法car1.setSpeed(50)#調(diào)用成員方法print(car1.speed)Python類型的動(dòng)態(tài)性使得我們可以動(dòng)態(tài)為自定義類及其對(duì)象增加新的屬性和行為,俗稱混入(mixin)機(jī)制,這在大型項(xiàng)目開發(fā)中會(huì)非常方便和實(shí)用。例如系統(tǒng)中的所有用戶分類非常復(fù)雜,不同用戶組具有不同的行為和權(quán)限,并且可能會(huì)經(jīng)常改變。這時(shí)候我們可以獨(dú)立地定義一些行為,然后根據(jù)需要來(lái)為不同的用戶設(shè)置相應(yīng)的行為能力。7.1.3類成員與實(shí)例成員>>>importtypes>>>classPerson(object):

def__init__(self,name):

assertisinstance(name,str),'namemustbestring'

=name>>>defsing(self):

print(+'cansing.')>>>defwalk(self):

print(+'canwalk.')

>>>defeat(self):

print(+'caneat.')7.1.3類成員與實(shí)例成員>>>zhang=Person('zhang')>>>zhang.sing()#用戶不具有該行為AttributeError:'Person'objecthasnoattribute'sing'>>>zhang.sing=types.MethodType(sing,zhang)#動(dòng)態(tài)增加一個(gè)新行為>>>zhang.sing()zhangcansing.>>>zhang.walk()AttributeError:'Person'objecthasnoattribute'walk'>>>zhang.walk=types.MethodType(walk,zhang)>>>zhang.walk()zhangcanwalk.>>>delzhang.walk#刪除用戶行為>>>zhang.walk()AttributeError:'Person'objecthasnoattribute'walk'7.1.3類成員與實(shí)例成員7.1.3類成員與實(shí)例成員在Python中,函數(shù)和方法是有區(qū)別的。方法一般指與特定實(shí)例綁定的函數(shù),通過(guò)對(duì)象調(diào)用方法時(shí),對(duì)象本身將被作為第一個(gè)參數(shù)隱式傳遞過(guò)去,普通函數(shù)并不具備這個(gè)特點(diǎn)。>>>classDemo:

pass>>>t=Demo()>>>deftest(self,v):

self.value=v >>>t.test=test>>>t.test#普通函數(shù)<functiontestat0x00000000034B7EA0>>>>t.test(t,3)#必須為self參數(shù)傳值7.1.3類成員與實(shí)例成員>>>t.test=types.MethodType(test,t)>>>t.test#綁定的方法<boundmethodtestof<__main__.Demoobjectat0x000000000074F9E8>>>>>t.test(5)#不需要為self參數(shù)傳值7.1.4私有成員與公有成員Python并沒(méi)有對(duì)私有成員提供嚴(yán)格的訪問(wèn)保護(hù)機(jī)制。在定義類的成員時(shí),如果成員名以兩個(gè)下劃線“__”或更多下劃線開頭而不以兩個(gè)或更多下劃線結(jié)束則表示是私有成員。私有成員在類的外部不能直接訪問(wèn),需要通過(guò)調(diào)用對(duì)象的公開成員方法來(lái)訪問(wèn),也可以通過(guò)Python支持的特殊方式來(lái)訪問(wèn)。公開成員既可以在類的內(nèi)部進(jìn)行訪問(wèn),也可以在外部程序中使用。7.1.4私有成員與公有成員>>>classA: def__init__(self,value1=0,value2=0): self._value1=value1 self.__value2=value2 defsetValue(self,value1,value2): self._value1=value1 self.__value2=value2 defshow(self): print(self._value1) print(self.__value2)>>>a=A()>>>a._value10>>>a._A__value2#在外部訪問(wèn)對(duì)象的私有數(shù)據(jù)成員07.1.4私有成員與公有成員在IDLE環(huán)境中,在對(duì)象或類名后面加上一個(gè)圓點(diǎn)“.”,稍等一秒鐘則會(huì)自動(dòng)列出其所有公開成員,模塊也具有同樣的用法。如果在圓點(diǎn)“.”后面再加一個(gè)下劃線,則會(huì)列出該對(duì)象、類或模塊的所有成員,包括私有成員。7.1.4私有成員與公有成員在Python中,以下劃線開頭的變量名和方法名有特殊的含義,尤其是在類的定義中。用下劃線作為變量名和方法名前綴和后綴來(lái)表示類的特殊成員:_xxx:受保護(hù)成員,不能用'frommoduleimport*'導(dǎo)入;__xxx__:系統(tǒng)定義的特殊成員;__xxx:私有成員,只有類對(duì)象自己能訪問(wèn),子類對(duì)象不能直接訪問(wèn)到這個(gè)成員,但在對(duì)象外部可以通過(guò)“對(duì)象名._類名__xxx”這樣的特殊方式來(lái)訪問(wèn)。注意:Python中不存在嚴(yán)格意義上的私有成員。7.1.4私有成員與公有成員在IDLE交互模式下,一個(gè)下劃線“_”表示解釋器中最后一次顯示的內(nèi)容或最后一次語(yǔ)句正確執(zhí)行的輸出結(jié)果。>>>3+58>>>8+210>>>_*330>>>_/56.0>>>1/0ZeroDivisionError:integerdivisionormodulobyzero>>>_6.0在程序中,可以使用一個(gè)下劃線來(lái)表示不關(guān)心該變量的值。>>>for_inrange(5):

print(3,end='')

33333>>>a,_=divmod(60,18)#只關(guān)心整商,不關(guān)心余數(shù),

#等價(jià)于a=60//18>>>a37.1.4私有成員與公有成員7.1.4私有成員與公有成員下面的代碼演示了特殊成員定義和訪問(wèn)的方法:>>>classFruit:

def__init__(self):

self.__color='Red'

self.price=1>>>apple=Fruit()>>>apple.price#顯示對(duì)象公開數(shù)據(jù)成員的值1>>>apple.price=2#修改對(duì)象公開數(shù)據(jù)成員的值>>>apple.price2>>>print(apple.price,apple._Fruit__color)#顯示對(duì)象私有數(shù)據(jù)成員的值2Red>>>apple._Fruit__color="Blue"#修改對(duì)象私有數(shù)據(jù)成員的值>>>print(apple.price,apple._Fruit__color)2Blue>>>print(apple.__color)#不能直接訪問(wèn)對(duì)象的私有數(shù)據(jù)成員,出錯(cuò)AttributeError:Fruitinstancehasnoattribute'__color'7.2方法在類中定義的方法可以粗略分為四大類:公有方法、私有方法、靜態(tài)方法和類方法。公有方法、私有方法都屬于對(duì)象,私有方法的名字以兩個(gè)下劃線“__”開始,每個(gè)對(duì)象都有自己的公有方法和私有方法,在這兩類方法中可以訪問(wèn)屬于類和對(duì)象的成員;公有方法通過(guò)對(duì)象名直接調(diào)用,私有方法不能通過(guò)對(duì)象名直接調(diào)用,只能在屬于對(duì)象的方法中通過(guò)self調(diào)用或在外部通過(guò)Python支持的特殊方式來(lái)調(diào)用。如果通過(guò)類名來(lái)調(diào)用屬于對(duì)象的公有方法,需要顯式為該方法的self參數(shù)傳遞一個(gè)對(duì)象名,用來(lái)明確指定訪問(wèn)哪個(gè)對(duì)象的數(shù)據(jù)成員。7.2方法靜態(tài)方法和類方法都可以通過(guò)類名和對(duì)象名調(diào)用,但不能直接訪問(wèn)屬于對(duì)象的成員,只能訪問(wèn)屬于類的成員。靜態(tài)方法可以沒(méi)有參數(shù)。一般將cls作為類方法的第一個(gè)參數(shù)名稱,但也可以使用其他的名字作為參數(shù),并且在調(diào)用類方法時(shí)不需要為該參數(shù)傳遞值。>>>classRoot:__total=0def__init__(self,v):#構(gòu)造方法self.__value=vRoot.__total+=1defshow(self):#普通實(shí)例方法print('self.__value:',self.__value)print('Root.__total:',Root.__total)@classmethod#修飾器,聲明類方法defclassShowTotal(cls):#類方法print(cls.__total)@staticmethod#修飾器,聲明靜態(tài)方法defstaticShowTotal():#靜態(tài)方法print(Root.__total)7.2方法7.2方法>>>r=Root(3)>>>r.classShowTotal()#通過(guò)對(duì)象來(lái)調(diào)用類方法1>>>r.staticShowTotal()#通過(guò)對(duì)象來(lái)調(diào)用靜態(tài)方法1>>>r.show()self.__value:3Root.__total:1>>>rr=Root(5)>>>Root.classShowTotal()#通過(guò)類名調(diào)用類方法2>>>Root.staticShowTotal()#通過(guò)類名調(diào)用靜態(tài)方法27.2方法>>>Root.show()#試圖通過(guò)類名直接調(diào)用實(shí)例方法,失敗TypeError:unboundmethodshow()mustbecalledwithRootinstanceasfirstargument(gotnothinginstead)>>>Root.show(r)#但是可以通過(guò)這種方法來(lái)調(diào)用方法并訪問(wèn)實(shí)例成員self.__value:3Root.__total:2>>>Root.show(rr)#通過(guò)類名調(diào)用實(shí)例方法時(shí)為self參數(shù)顯式傳遞對(duì)象名self.__value:5Root.__total:27.3屬性Python2.x和Python3.x對(duì)屬性的實(shí)現(xiàn)和處理方式不一樣,內(nèi)部實(shí)現(xiàn)有較大的差異,使用時(shí)應(yīng)注意二者之間的區(qū)別。7.3.1Python2.x中的屬性在Python2.x中,使用@property或property()來(lái)聲明一個(gè)屬性,然而屬性并沒(méi)有得到真正意義的實(shí)現(xiàn),也沒(méi)有提供應(yīng)有的訪問(wèn)保護(hù)機(jī)制。在Python2.x中,為對(duì)象增加新的數(shù)據(jù)成員時(shí),隱藏同名的已有屬性。>>>classTest: def__init__(self,value): self.__value=value @property#修飾器,用來(lái)聲明屬性 defvalue(self): returnself.__value>>>a=Test(3)>>>a.value3>>>a.value=5#動(dòng)態(tài)添加了新成員,隱藏了定義的屬性>>>a.value5>>>t._Test__value#原來(lái)的私有變量沒(méi)有改變37.3.1Python2.x中的屬性除了動(dòng)態(tài)增加成員時(shí)會(huì)隱藏已有屬性,下面的代碼從表面看來(lái)是修改屬性的值,而實(shí)際上也是增加了新成員,從而隱藏了已有屬性。>>>classTest: def__init__(self,value): self.__value=value def__get(self): returnself.__value def__set(self,v): self.__value=v value=property(__get,__set)#可讀、可寫屬性 defshow(self): printself.__value7.3.1Python2.x中的屬性>>>t=Test(3)>>>t.value3>>>t.value+=2#動(dòng)態(tài)添加了新成員>>>t.value#這里訪問(wèn)的是新成員5>>>t.show()#訪問(wèn)原來(lái)定義的私有數(shù)據(jù)成員3>>>delt.value#這里刪除的是剛才添加的新成員>>>t.value#訪問(wèn)原來(lái)的屬性3>>>delt.value#試圖刪除屬性,失敗AttributeError:Testinstancehasnoattribute'value'>>>delt._Test__value#刪除私有成員>>>t.value#訪問(wèn)屬性,但對(duì)應(yīng)的私有成員已不存在,失敗AttributeError:Testinstancehasnoattribute'_Test__value'7.3.1Python2.x中的屬性下面的代碼演示了普通數(shù)據(jù)成員和私有數(shù)據(jù)成員的區(qū)別:>>>classTest: defshow(self): printself.value printself.__v>>>t=Test()>>>t.show()AttributeError:Testinstancehasnoattribute'value'>>>t.value=3#添加新的數(shù)據(jù)成員>>>t.show()3AttributeError:Testinstancehasnoattribute'_Test__v'>>>t.__v=5>>>t.show()3AttributeError:Testinstancehasnoattribute'_Test__v'>>>t._Test__v=5#添加私有數(shù)據(jù)成員>>>t.show()357.3.2Python3.x中的屬性在Python3.x中,屬性得到了較為完整的實(shí)現(xiàn),支持更加全面的保護(hù)機(jī)制。7.3.2Python3.x中的屬性只讀屬性>>>classTest: def__init__(self,value): self.__value=value @property defvalue(self):#只讀,無(wú)法修改和刪除

returnself.__value7.3.2Python3.x中的屬性>>>t=Test(3)>>>t.value3>>>t.value=5#只讀屬性不允許修改值A(chǔ)ttributeError:can'tsetattribute>>>t.v=5#動(dòng)態(tài)增加新成員>>>t.v5>>>delt.v#動(dòng)態(tài)刪除成員>>>delt.value#試圖刪除對(duì)象屬性,失敗AttributeError:can'tdeleteattribute>>>t.value37.3.2Python3.x中的屬性可讀、可寫屬性>>>classTest: def__init__(self,value): self.__value=value def__get(self): returnself.__value def__set(self,v): self.__value=v value=property(__get,__set) defshow(self): print(self.__value)7.3.2Python3.x中的屬性>>>t=Test(3)>>>t.value#允許讀取屬性值3>>>t.value=5#允許修改屬性值>>>t.value5>>>t.show()#屬性對(duì)應(yīng)的私有變量也得到了相應(yīng)的修改5>>>delt.value#試圖刪除屬性,失敗AttributeError:can'tdeleteattribute7.3.2Python3.x中的屬性也可以將屬性設(shè)置為可讀、可修改、可刪除。>>>classTest: def__init__(self,value): self.__value=value def__get(self): returnself.__value def__set(self,v): self.__value=v def__del(self): delself.__value value=property(__get,__set,__del) defshow(self): print(self.__value)7.3.2Python3.x中的屬性>>>t=Test(3)>>>t.show()3>>>t.value3>>>t.value=5>>>t.show()5>>>t.value57.3.2Python3.x中的屬性>>>delt.value#刪除屬性>>>t.value#對(duì)應(yīng)的私有數(shù)據(jù)成員已刪除AttributeError:'Test'objecthasnoattribute'_Test__value'>>>t.show()AttributeError:'Test'objecthasnoattribute'_Test__value'>>>t.value=1#為對(duì)象動(dòng)態(tài)增加屬性和對(duì)應(yīng)的私有數(shù)據(jù)成員>>>t.show()1>>>t.value17.4.1常用特殊方法Python類有大量的特殊方法,其中比較常見(jiàn)的是構(gòu)造函數(shù)和析構(gòu)函數(shù),除此之外,Python還支持大量的特殊方法,運(yùn)算符重載就是通過(guò)重寫特殊方法實(shí)現(xiàn)的。Python中類的構(gòu)造函數(shù)是__init__(),一般用來(lái)為數(shù)據(jù)成員設(shè)置初值或進(jìn)行其他必要的初始化工作,在創(chuàng)建對(duì)象時(shí)被自動(dòng)調(diào)用和執(zhí)行。如果用戶沒(méi)有設(shè)計(jì)構(gòu)造函數(shù),Python將提供一個(gè)默認(rèn)的構(gòu)造函數(shù)用來(lái)進(jìn)行必要的初始化工作。Python中類的析構(gòu)函數(shù)是__del__(),一般用來(lái)釋放對(duì)象占用的資源,在Python刪除對(duì)象和收回對(duì)象空間時(shí)被自動(dòng)調(diào)用和執(zhí)行。如果用戶沒(méi)有編寫析構(gòu)函數(shù),Python將提供一個(gè)默認(rèn)的析構(gòu)函數(shù)進(jìn)行必要的清理工作。方法功能說(shuō)明__new__()類的靜態(tài)方法,用于確定是否要?jiǎng)?chuàng)建對(duì)象__init__()構(gòu)造方法,創(chuàng)建對(duì)象時(shí)自動(dòng)調(diào)用__del__()析構(gòu)方法,釋放對(duì)象時(shí)自動(dòng)調(diào)用__add__()+__sub__()-__mul__()*__truediv__()/__floordiv__()//__mod__()%__pow__()**__eq__()、__ne__()、__lt__()、__le__()、__gt__()、__ge__()==、!=、<、<=、>、>=__lshift__()、__rshift__()<<、>>__and__()、__or__()、__invert__()、__xor__()&、|、~、^7.4.1常用特殊方法方法功能說(shuō)明__iadd__()、__isub__()+=、-=,很多其他運(yùn)算符也有與之對(duì)應(yīng)的復(fù)合賦值運(yùn)算符__pos__()一元運(yùn)算符+,正號(hào)__neg__()一元運(yùn)算符-,負(fù)號(hào)__contains__()與成員測(cè)試運(yùn)算符in對(duì)應(yīng)__radd__()、__rsub__反射加法、反射減法,一般與普通加法和減法具有相同的功能,但操作數(shù)的位置或順序相反,很多其他運(yùn)算符也有與之對(duì)應(yīng)的反射運(yùn)算符__abs__()與內(nèi)置函數(shù)abs()對(duì)應(yīng)__bool__()與內(nèi)置函數(shù)bool()對(duì)應(yīng),要求該方法必須返回True或False__bytes__()與內(nèi)置函數(shù)bytes()對(duì)應(yīng)__complex__()與內(nèi)置函數(shù)complex()對(duì)應(yīng),要求該方法必須返回復(fù)數(shù)__dir__()與內(nèi)置函數(shù)dir()對(duì)應(yīng)__divmod__()與內(nèi)置函數(shù)divmod()對(duì)應(yīng)__float__()與內(nèi)置函數(shù)float()對(duì)應(yīng),要求該該方法必須返回實(shí)數(shù)__hash__()與內(nèi)置函數(shù)hash()對(duì)應(yīng)__int__()與內(nèi)置函數(shù)int()對(duì)應(yīng),要求該方法必須返回整數(shù)7.4.1常用特殊方法方法功能說(shuō)明__len__()與內(nèi)置函數(shù)len()對(duì)應(yīng)__next__()與內(nèi)置函數(shù)next()對(duì)應(yīng)__reduce__()提供對(duì)reduce()函數(shù)的支持__reversed__()與內(nèi)置函數(shù)reversed()對(duì)應(yīng)__round__()對(duì)內(nèi)置函數(shù)round()對(duì)應(yīng)__str__()與內(nèi)置函數(shù)str()對(duì)應(yīng),要求該方法必須返回str類型的數(shù)據(jù)__repr__()打印、轉(zhuǎn)換,要求該方法必須返回str類型的數(shù)據(jù)__getitem__()按照索引獲取值__setitem__()按照索引賦值__delattr__()刪除對(duì)象的指定屬性__getattr__()獲取對(duì)象指定屬性的值,對(duì)應(yīng)成員訪問(wèn)運(yùn)算符“.”7.4.1常用特殊方法方法功能說(shuō)明__getattribute__()獲取對(duì)象指定屬性的值,如果同時(shí)定義了該方法與__getattr__(),那么__getattr__()將不會(huì)被調(diào)用,除非在__getattribute__()中顯式調(diào)用__getattr__()或者拋出AttributeError異常__setattr__()設(shè)置對(duì)象指定屬性的值__base__該類的基類__class__返回對(duì)象所屬的類__dict__對(duì)象所包含的屬性與值的字典__subclasses__()返回該類的所有子類__call__()包含該特殊方法的類的實(shí)例可以像函數(shù)一樣調(diào)用__get__()定義了這三個(gè)特殊方法中任何一個(gè)的類稱作描述符(descriptor),描述符對(duì)象一般作為其他類的屬性來(lái)使用,這三個(gè)方法分別在獲取屬性、修改屬性值或刪除屬性時(shí)被調(diào)用__set__()__delete__()7.4.1常用特殊方法7.4.2案例精選例6-1:自定義數(shù)組。在MyArray.py文件中,定義了一個(gè)數(shù)組類,重寫了一部分特殊方法以支持?jǐn)?shù)組之間、數(shù)組與整數(shù)之間的四則運(yùn)算以及內(nèi)積、大小比較、成員測(cè)試和元素訪問(wèn)等運(yùn)算符。code\MyArray.py7.4.2案例精選>>>fromMyArrayimportMyArray>>>x=MyArray(1,2,3,4,5,6)>>>y=MyArray(6,5,4,3,2,1)>>>len(x)6>>>x+5[6,7,8,9,10,11]>>>x*3[3,6,9,12,15,18]>>>x.dot(y)56>>>x.append(7)>>>x[1,2,3,4,5,6,7]>>>x.dot(y)Thesizemustbeequal.>>>x[9]=8Indextypeerrororoutofrange7.4.2案例精選>>>x/2[0.5,1.0,1.5,2.0,2.5,3.0,3.5]>>>x//2[0,1,1,2,2,3,3]>>>x%3[1,2,0,1,2,0,1]>>>x[2]3>>>'a'inxFalse>>>3inxTrue>>>x<yTrue>>>x=MyArray(1,2,3,4,5,6)>>>x+y[7,7,7,7,7,7]例6-2自定義集合。模擬Python內(nèi)置集合類型,實(shí)現(xiàn)元素添加、刪除以及并集、交集、對(duì)稱差集等基本運(yùn)算。code\mySet.py7.4.2案例精選>>>frommySetimportSet#導(dǎo)入自定義集合類>>>x=Set(range(10))#創(chuàng)建集合對(duì)象>>>y=Set(range(8,15))>>>z=Set([1,2,3,4,5])>>>x{0,1,2,3,4,5,6,7,8,9}>>>y{8,9,10,11,12,13,14}>>>z.add(6)#增加元素>>>z{1,2,3,4,5,6}>>>z.remove(3)#刪除指定元素刪除成功>>>z{1,2,4,5,6}7.4.2案例精選>>>y.pop()#隨機(jī)刪除一個(gè)元素11>>>x-y#差集{0,1,2,3,4,5,6,7}>>>x-z{0,3,7,8,9}>>>x.difference(y){0,1,2,3,4,5,6,7}>>>x|y#并集{0,1,2,3,4,5,6,7,8,9,10,12,13,14}>>>x.union(y){0,1,2,3,4,5,6,7,8,9,10,12,13,14}>>>x&z#交集{1,2,4,5,6}7.4.2案例精選>>>x^z#對(duì)稱差集{0,3,7,8,9}>>>x.symetric_difference(y){0,1,2,3,4,5,6,7,10,12,13,14}>>>(x-y)|(y-x){0,1,2,3,4,5,6,7,10,12,13,14}>>>x==y#測(cè)試兩個(gè)集合是否相等False>>>x>y#測(cè)試集合包含關(guān)系False>>>y>xFalse>>>x>zTrue>>>x>=zTrue7.4.2案例精選>>>z.issubset(x)#測(cè)試z是否為x的子集True>>>x.issuperset(z)#測(cè)試x是否為z的超集True>>>3inx#測(cè)試集合中是否存在某個(gè)元素True>>>33inxFalse>>>len(y)#計(jì)算集合中元素個(gè)數(shù)6>>>y.clear()集合已清空>>>y.pop()集合已空,彈出操作被忽略7.4.2案例精選例6-3自定義棧,實(shí)現(xiàn)基本的入棧、出棧操作。code\Stack.py7.4.2案例精選例6-4自定義隊(duì)列結(jié)構(gòu),實(shí)現(xiàn)入隊(duì)、出隊(duì)操作,提供超時(shí)功能。code\myQueue.py7.4.2案例精選例6-5自定義常量類。每個(gè)類和對(duì)象都有一個(gè)叫作__dict__的字典成員,用來(lái)記錄該類或?qū)ο笏鶕碛械膶傩浴.?dāng)訪問(wèn)對(duì)象屬性時(shí),首先會(huì)嘗試在對(duì)象屬性中查找,如果找不到就到類屬性中查找。Python內(nèi)置類型不支持屬性的增加,用戶自定義類及其對(duì)象一般支持屬性和方法的增加與刪除。在下面定義的常量類中,要求對(duì)象的成員必須大寫,所有成員的值不能相同,并且不允許修改已有成員的值。7.4.2案例精選>>>classConstants:def__setattr__(self,name,value):assertnamenotinself.__dict__,'Youcannotmodify'+nameassertname.isupper(),'Constantshouldbeuppercase.'assertvaluenotinself.__dict__.values(),'Valuealreadyexists.'self.__dict__[name]=value

>>>t=Constants()>>>t.R=3#成員不存在,允許添加>>>t.R=4#成員已存在,不允許修改AssertionError:YoucannotmodifyR>>>t.G=4>>>t.g=4#成員必須大寫AssertionError:Constantshouldbeuppercase.>>>t.B=4#成員的值不允許相同AssertionError:Valuealreadyexists.7.4.2案例精選例6-6自定義支持關(guān)鍵字with的類。如果自定義類中實(shí)現(xiàn)了特殊方法__enter__()和__exit__(),那么該類的對(duì)象就可以像內(nèi)置函數(shù)open()返回的文件對(duì)象一樣支持with關(guān)鍵字來(lái)實(shí)現(xiàn)資源的自動(dòng)管理。classmyOpen:def__init__(self,fileName,mode='r'):self.fp=open(fileName,mode)def__enter__(self):returnself.fpdef__exit__(self,exceptionType,exceptionVal,trace):self.fp.close()withmyOpen('test.txt')asfp:print(fp.read())7.4.2案例精選文件操作為了長(zhǎng)期保存數(shù)據(jù)以便重復(fù)使用、修改和共享,必須將數(shù)據(jù)以文件的形式存儲(chǔ)到外部存儲(chǔ)介質(zhì)(如磁盤、U盤、光盤或云盤、網(wǎng)盤、快盤等)中。文件操作在各類應(yīng)用軟件的開發(fā)中均占有重要的地位:管理信息系統(tǒng)是使用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù)的,而數(shù)據(jù)庫(kù)最終還是要以文件的形式存儲(chǔ)到硬盤或其他存儲(chǔ)介質(zhì)上。應(yīng)用程序的配置信息往往也是使用文件來(lái)存儲(chǔ)的,圖形、圖像、音頻、視頻、可執(zhí)行文件等等也都是以文件的形式存儲(chǔ)在磁盤上的。文件操作按文件中數(shù)據(jù)的組織形式把文件分為文本文件和二進(jìn)制文件兩類。文本文件:文本文件存儲(chǔ)的是常規(guī)字符串,由若干文本行組成,通常每行以換行符'\n'結(jié)尾。常規(guī)字符串是指記事本或其他文本編輯器能正常顯示、編輯并且人類能夠直接閱讀和理解的字符串,如英文字母、漢字、數(shù)字字符串。文本文件可以使用字處理軟件如gedit、記事本進(jìn)行編輯。二進(jìn)制文件:二進(jìn)制文件把對(duì)象內(nèi)容以字節(jié)串(bytes)進(jìn)行存儲(chǔ),無(wú)法用記事本或其他普通字處理軟件直接進(jìn)行編輯,通常也無(wú)法被人類直接閱讀和理解,需要使用專門的軟件進(jìn)行解碼后讀取、顯示、修改或執(zhí)行。常見(jiàn)的如圖形圖像文件、音視頻文件、可執(zhí)行文件、資源文件、各種數(shù)據(jù)庫(kù)文件、各類office文檔等都屬于二進(jìn)制文件。8.1文件基本操作文件內(nèi)容操作三部曲:打開、讀寫、關(guān)閉open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)文件名指定了被打開的文件名稱。打開模式指定了打開文件后的處理方式。緩沖區(qū)指定了讀寫文件的緩存模式。0表示不緩存,1表示緩存,如大于1則表示緩沖區(qū)的大小。默認(rèn)值是緩存模式。參數(shù)encoding指定對(duì)文本進(jìn)行編碼和解碼的方式,只適用于文本模式,可以使用Python支持的任何格式,如GBK、utf8、CP936等等。如果執(zhí)行正常,open()函數(shù)返回1個(gè)可迭代的文件對(duì)象,通過(guò)該文件對(duì)象可以對(duì)文件進(jìn)行讀寫操作。如果指定文件不存在、訪問(wèn)權(quán)限不夠、磁盤空間不夠或其他原因?qū)е聞?chuàng)建文件對(duì)象失敗則拋出異常。下面的代碼分別以讀、寫方式打開了兩個(gè)文件并創(chuàng)建了與之對(duì)應(yīng)的文件對(duì)象。f1=open('file1.txt','r')f2=open('file2.txt','w')當(dāng)對(duì)文件內(nèi)容操作完以后,一定要關(guān)閉文件對(duì)象,這樣才能保證所做的任何修改都確實(shí)被保存到文件中。f1.close()8.1文件基本操作需要注意的是,即使寫了關(guān)閉文件的代碼,也無(wú)法保證文件一定能夠正常關(guān)閉。例如,如果在打開文件之后和關(guān)閉文件之前發(fā)生了錯(cuò)誤導(dǎo)致程序崩潰,這時(shí)文件就無(wú)法正常關(guān)閉。在管理文件對(duì)象時(shí)推薦使用with關(guān)鍵字,可以有效地避免這個(gè)問(wèn)題。8.1文件基本操作用于文件內(nèi)容讀寫時(shí),with語(yǔ)句的用法如下:withopen(filename,mode,encoding)asfp:#這里寫通過(guò)文件對(duì)象fp讀寫文件內(nèi)容的語(yǔ)句另外,上下文管理語(yǔ)句with還支持下面的用法,進(jìn)一步簡(jiǎn)化了代碼的編寫。withopen('test.txt','r')assrc,open('test_new.txt','w')asdst:dst.write(src.read())8.1文件基本操作8.1文件基本操作文件打開方式模式說(shuō)明r讀模式(默認(rèn)模式,可省略),如果文件不存在則拋出異常w寫模式,如果文件已存在,先清空原有內(nèi)容x寫模式,創(chuàng)建新文件,如果文件已存在則拋出異常a追加模式,不覆蓋文件中原有內(nèi)容b二進(jìn)制模式(可與其他模式組合使用)t文本模式(默認(rèn)模式,可省略)+讀、寫模式(可與其他模式組合使用)文件對(duì)象常用屬性屬性說(shuō)明buffer返回當(dāng)前文件的緩沖區(qū)對(duì)象closed判斷文件是否關(guān)閉,若文件已關(guān)閉則返回Truefileno文件號(hào),一般不需要太關(guān)心這個(gè)數(shù)字mode返回文件的打開模式name返回文件的名稱8.1文件基本操作文件對(duì)象常用方法方法功能說(shuō)明close()把緩沖區(qū)的內(nèi)容寫入文件,同時(shí)關(guān)閉文件,并釋放文件對(duì)象detach()分離并返回底層的緩沖,底層緩沖被分離后,文件對(duì)象不再可用,不允許做任何操作flush()把緩沖區(qū)的內(nèi)容寫入文件,但不關(guān)閉文件read([size])從文本文件中讀取size個(gè)字符(Python3.x)的內(nèi)容作為結(jié)果返回,或從二進(jìn)制文件中讀取指定數(shù)量的字節(jié)并返回,如果省略size則表示讀取所有內(nèi)容readable()測(cè)試當(dāng)前文件是否可讀readline() 從文本文件中讀取一行內(nèi)容作為結(jié)果返回readlines()把文本文件中的每行文本作為一個(gè)字符串存入列表中,返回該列表,對(duì)于大文件會(huì)占用較多內(nèi)存,不建議使用seek(offset[,whence])把文件指針移動(dòng)到新的位置,offset表示相對(duì)于whence的位置。whence為0表示從文件頭開始計(jì)算,1表示從當(dāng)前位置開始計(jì)算,2表示從文件尾開始計(jì)算,默認(rèn)為0seekable()測(cè)試當(dāng)前文件是否支持隨機(jī)訪問(wèn),如果文件不支持隨機(jī)訪問(wèn),則調(diào)用方法seek()、tell()和truncate()時(shí)會(huì)拋出異常tell() 返回文件指針的當(dāng)前位置truncate([size])刪除從當(dāng)前指針位置到文件末尾的內(nèi)容。如果指定了size,則不論指針在什么位置都只留下前size個(gè)字節(jié),其余的一律刪除write(s)把s的內(nèi)容寫入文件writable()測(cè)試當(dāng)前文件是否可寫writelines(s)把字符串列表寫入文本文件,不添加換行符8.1文件基本操作8.

溫馨提示

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