《Python程序設(shè)計(jì)基礎(chǔ)》課件-項(xiàng)目6 面對對象編程_第1頁
《Python程序設(shè)計(jì)基礎(chǔ)》課件-項(xiàng)目6 面對對象編程_第2頁
《Python程序設(shè)計(jì)基礎(chǔ)》課件-項(xiàng)目6 面對對象編程_第3頁
《Python程序設(shè)計(jì)基礎(chǔ)》課件-項(xiàng)目6 面對對象編程_第4頁
《Python程序設(shè)計(jì)基礎(chǔ)》課件-項(xiàng)目6 面對對象編程_第5頁
已閱讀5頁,還剩57頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

項(xiàng)目6面對對象編程任務(wù)5實(shí)踐活動任務(wù)1面向?qū)ο笕蝿?wù)2類與對象任務(wù)3構(gòu)造方法與析構(gòu)方法任務(wù)4繼承任務(wù)5實(shí)踐活動任務(wù)1面向?qū)ο笕蝿?wù)2類與對象任務(wù)3構(gòu)造方法與析構(gòu)方法任務(wù)4繼承面向?qū)ο蟾攀雒嫦蜻^程:面向過程的程序設(shè)計(jì)方法強(qiáng)調(diào)分析、解決問題的步驟,并用函數(shù)實(shí)現(xiàn)這些步驟,通過函數(shù)調(diào)用完成特定功能。面向過程的程序設(shè)計(jì)以算法為核心,在計(jì)算機(jī)中用數(shù)據(jù)描述事物,程序則用于處理這些數(shù)據(jù)。面向?qū)ο螅喊呀鉀Q的問題按一定的規(guī)則劃分為多個獨(dú)立的對象,通過調(diào)用對象的方法來實(shí)現(xiàn)多個對象相互配合,完成應(yīng)用程序功能。面向?qū)ο蟮幕靖拍顚ο螅簩⒚枋鍪挛锏囊唤M數(shù)據(jù)和與這組數(shù)據(jù)有關(guān)的操作封裝在一起,形成一個實(shí)體,這個實(shí)體就是對象。類:具有相同性質(zhì)的對象的抽象。面向?qū)ο缶幊痰奶攸c(diǎn)面向?qū)ο蟮娜齻€基本特征:封裝、繼承、多態(tài)。封裝:封裝是面向?qū)ο蟮暮诵乃枷?,將對象的屬性和行為封裝起來,不需要讓外界知道具體實(shí)現(xiàn)細(xì)節(jié),這就是封裝思想。繼承:一個派生類繼承基類的屬性和方法。多態(tài):多態(tài)指同一個屬性或行為在父類及其各派生類中具有不同的語義。任務(wù)5實(shí)踐活動任務(wù)1面向?qū)ο笕蝿?wù)2類與對象任務(wù)3構(gòu)造方法與析構(gòu)方法任務(wù)4繼承類與對象的關(guān)系對象(Object)是系統(tǒng)中用來描述客觀事物的一個實(shí)體,它是構(gòu)成系統(tǒng)的一個基本單位。它們是有形的,如某個人、某種物品;也可以是無形的,如某項(xiàng)計(jì)劃、某次商業(yè)交易。對象包含特征和行為,特征指對象的外觀、性質(zhì)、屬性等;行為指對象具有的功能、動作等。例如,一個名字叫張三的同學(xué)就是一個對象。他具有自己的特征:學(xué)號=2,姓名=“張三”,出生年月=“1984-11-11”,家庭住址=“中國山東省青島市”。具有上課、做作業(yè)、休息等行為。日常生活中把眾多事物進(jìn)行歸納、劃分,然后分類是人類在認(rèn)識客觀世界時經(jīng)常采用的思維方法。換句話說“類”是從日常生活中抽象出來的具有共同特征的實(shí)體。因此我們把具有相同特征及相同行為的一組對象稱為類,類是具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象的抽象。因此,對象是類的抽象,類的實(shí)例是對象。例如:張三同學(xué)是一個對象,李四同學(xué)也是一個對象,并且全班的同學(xué)都有學(xué)號、姓名、出生年月、家庭住址,具有上課、做作業(yè)、休息等行為。從整個班級所有的對象中抽象出共同特征和行為就可以形成我們常說的“學(xué)生”類,此時,學(xué)生就是一個類。在python中,我們可以定義類,然后創(chuàng)建類的對象。類的定義與訪問類就是用于描述某一類事物,相當(dāng)于一個模板。類的定義:定義一個類應(yīng)該要有屬性和方法(屬性和方法一定是該類事物所共有的)。語法格式如下:class類名:

屬性名=屬性值def方法名(self):

方法體例如,人可以抽象為一個類,這個類當(dāng)中包含了頭、眼睛和嘴等屬性以及吃飯、睡覺等行為特征(方法)。classPerson:head=1mouse=1eyes=2defeat(self):

方法體defsleep(self):

方法體在Person類中:class:即類的意思,用于修飾一個類。Person:在此代表類名。head、mouse、eyes:數(shù)據(jù)成員名,或稱為屬性。eat、sleep:成員函數(shù)名,或稱為方法。需要注意的是,方法中有一個指向?qū)ο蟮哪J(rèn)參數(shù)self。對象的創(chuàng)建與使用類定義完成后不能直接使用,這就好比畫好了一張房屋設(shè)計(jì)圖紙,此圖紙只能幫助人們了解房屋的結(jié)構(gòu),但不能提供居住場所。為滿足居住需求,需要根據(jù)房屋設(shè)計(jì)圖紙搭建實(shí)際的房屋。同理,程序中的類需要實(shí)例化為對象才能實(shí)現(xiàn)其意義。①對象的創(chuàng)建創(chuàng)建對象的格式如下:對象名=類名()例:zhangsan=Person()②訪問對象成員若想在程序中真正地使用對象,需掌握訪問對象成員的方式。對象成員分為屬性和方法,它們的訪問格式分別如下:對象名.屬性對象名.方法()訪問限制1.類的私有屬性__private_attrs:兩個下劃線開頭,聲明private_attrs為私有屬性,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用私有屬性__private_attrs的方法是:self.__private_attrs。類的私有屬性應(yīng)用如下所示:classJustVariable: __secretVariable=2 #私有變量publicVariable=2 #公開變量

defnumber(self):self.__secretVariable+=2self.publicVariable+=3print(self.__secretVariable)counter=JustVariable()counter.number()counter.number()print(counter.publicVariable)print(counter.__secretVariable)#實(shí)例不能訪問私有變量上述代碼的執(zhí)行結(jié)果為:468Traceback(mostrecentcalllast):File"d:/ex0601.py",line13,in<module>print(counter.__secretVariable)#實(shí)例不能訪問私有變量AttributeError:'JustVariable'objecthasnoattribute'__secretVariable'從以上結(jié)果我們可以看出,在類的外部對象無法直接訪問私有變量,但可以通過公有方法獲取類的私有屬性。2.類的私有方法__private_method:兩個下劃線開頭,聲明private_method方法為私有方法,只能在類的內(nèi)部調(diào)用,不能在類的外部調(diào)用。類的私有方法應(yīng)如下所示:classPerson:def__init__(self,age,garde):self.age=age #publicself.__grade=garde #privatedefwhoami(self):print('age:',self.age)print('garde:',self.__grade)

def__secret(self): #私有方法print('這是私有方法')

defpublicmethod(self): #公共方法print('這是公共方法')self.__secret()

x=Person(14,6)x.whoami()x.publicmethod()x.__secret() #報(bào)錯上述代碼的執(zhí)行結(jié)果為:age:14garde:6這是公共方法這是私有方法Traceback(mostrecentcalllast):File"d:/ex0602.py",line20,in<module>x.__secret()#報(bào)錯AttributeError:'Person'objecthasnoattribute'__secret'從以上結(jié)果我們可以看出,在類的外部對象無法直接調(diào)用私有方法,但可以通過公有方法調(diào)用類的私有方法。任務(wù)5實(shí)踐活動任務(wù)1面向?qū)ο笕蝿?wù)2類與對象任務(wù)3構(gòu)造方法與析構(gòu)方法任務(wù)4繼承構(gòu)造方法構(gòu)造方法是Python類中的內(nèi)置方法之一,它的方法名為__init__,在創(chuàng)建一個類對象時會自動執(zhí)行,負(fù)責(zé)完成新創(chuàng)建對象的初始化工作。可以顯式定義構(gòu)造方法,創(chuàng)建對象時會調(diào)用顯式定義的__init__方法,若不顯式定義,則解釋器會調(diào)用默認(rèn)的__init__方法。1.只有一個參數(shù)的構(gòu)造方法代碼如右所示:classPerson: #定義Person類def__init__(self): #定義構(gòu)造方法print('調(diào)用構(gòu)造方法!')='王二' #將self對應(yīng)對象的name屬性賦值為“王二”defPrintInfo(self): #定義普通方法PrintInfoprint('姓名:%s'%) #輸出姓名信息if__name__=='__main__':stu=Person() #創(chuàng)建Person類對象stu,自動執(zhí)行構(gòu)造方法stu.PrintInfo() #通過stu對象調(diào)用PrintInfo方法運(yùn)行結(jié)果如下:調(diào)用構(gòu)造方法!姓名:王二其中,self代表類的實(shí)例,而非類。類的方法與普通的函數(shù)只有一個特別的區(qū)別——它們必須有一個額外的第一個參數(shù)名稱,按照慣例它的名稱是self。2.帶默認(rèn)參數(shù)的構(gòu)造方法如右所示:classPerson: #定義Person類def__init__(self,name='王二'):#定義構(gòu)造方法print('構(gòu)造方法被調(diào)用!')=name #將self對應(yīng)對象的name屬性賦為形參name的值defPrintInfo(self): #定義普通方法PrintInfoprint('姓名:%s'%)#輸出姓名信息if__name__=='__main__':per1=Person()#創(chuàng)建Person類對象per1,自動執(zhí)行構(gòu)造方法per2=Person('劉東梅')per1.PrintInfo() #通過per1對象調(diào)用PrintInfo方法per2.PrintInfo() #通過per2對象調(diào)用PrintInfo方法上述代碼的執(zhí)行結(jié)果為:構(gòu)造方法被調(diào)用!構(gòu)造方法被調(diào)用!姓名:王二姓名:劉東梅3.帶多個參數(shù)的構(gòu)造方法__init__()方法可以有參數(shù),參數(shù)通過__init__()傳遞到類的實(shí)例化操作上。代碼如右所示:classComplex:def__init__(self,x,y):self.x=xself.y=ya=Complex(2.0,3.5)print(a.x,a.y)上述代碼的執(zhí)行結(jié)果為:2.03.5析構(gòu)方法析構(gòu)方法是類的另一個內(nèi)置方法,它的方法名為__del__,在銷毀一個類對象時會自動執(zhí)行,負(fù)責(zé)完成待銷毀對象的資源清理工作,如關(guān)閉文件等。類對象銷毀有如下三種情況:(1)局部變量的作用域結(jié)束。(2)使用del刪除對象。(3)程序結(jié)束時,程序中的所有對象都將被銷毀。析構(gòu)方法代碼實(shí)例,代碼如下所示:classPerson:#定義person類def__init__(self,name): #定義構(gòu)造方法=name #將self對應(yīng)對象的name屬性賦值為形參name的值print('姓名為%s的對象被創(chuàng)建!'%)def__del__(self): #定義析構(gòu)方法print('姓名為%s的對象被銷毀!'%)

if__name__=='__main__':per1=Person('李剛') #創(chuàng)建Person類對象per1per2=Person('王剛') #創(chuàng)建Person類對象per2delper2 #使用del刪除stu2對象stu3=Person('劉海東') #創(chuàng)建person類對象per3上述代碼的執(zhí)行結(jié)果為:姓名為李剛的對象被創(chuàng)建!姓名為王剛的對象被創(chuàng)建!姓名為王剛的對象被銷毀!姓名為劉海東的對象被創(chuàng)建!姓名為李剛的對象被銷毀!姓名為劉海東的對象被銷毀!任務(wù)5實(shí)踐活動任務(wù)1面向?qū)ο笕蝿?wù)2類與對象任務(wù)3構(gòu)造方法與析構(gòu)方法任務(wù)4繼承在Python中,類的繼承是指在一個現(xiàn)有類的基礎(chǔ)上去構(gòu)建一個新的類,現(xiàn)有的類稱為父類或基類,新構(gòu)建出來的類稱為子類或派生類。其中,子類在繼承父類時,會自動擁有父類中的方法和屬性,另外也可以在子類中增加新的屬性和方法。單繼承定義子類時需要指定父類,其語法格式為:class子類名(父類名):語句1語句2

…語句N繼承實(shí)例,代碼如右所示:classPerson: #定義Person類defSetName(self,name):#定義SetName方法

=name

#將self對應(yīng)對象的name屬性賦為形參name的值classStudent(Person): #以Person類作為父類定義子類StudentdefSetSno(self,sno):#定義SetSno方法self.sno=sno #將self對應(yīng)對象的sno屬性賦為形參sno的值

classTeacher(Person): #以Person類作為父類defSetTno(self,tno): #定義SetTno方法self.tno=tno #將self對應(yīng)對象的tno屬性賦為形參tno的值if__name__=='__main__':stu=Student() #定義Student類對象stustu.SetSno('1101')#調(diào)用Student類中定義的SetSno方法stu.SetName('李世民') #調(diào)用Student類從Person類繼承過來的SetName#方法print('學(xué)號:%s,姓名:%s'%(stu.sno,))#輸出學(xué)號和姓名t=Teacher() #定義Teacher類對象tt.SetTno('8812') #調(diào)用Teacher類中定義的SetTno方法t.SetName('朱元璋')#調(diào)用Teacher類從Person類繼承過來的SetName方法print('教工號:%s,姓名:%s'%(t.tno,))#輸出教工號和姓名上述代碼的執(zhí)行結(jié)果為:學(xué)號:1101,姓名:李世民教工號:8812,姓名:朱元璋多繼承定義子類時需要指定父類,其語法格式為:class子類名(父類名1,父類名2,…,父類名M):語句1語句2

…語句N當(dāng)M等于1時,則為單繼承;當(dāng)M大于1時,則為多重繼承。需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,Python從左至右搜索即方法在子類中未找到時,從左到右查找父類中是否包含方法。代碼如下所示:classPeople:#定義基本屬性name=''age=0#定義私有屬性,私有屬性在類外部無法直接進(jìn)行訪問__weight=0#定義構(gòu)造方法def__init__(self,n,a,w):=nself.age=aself.__weight=wdefspeak(self):print("%s說:我%d歲。"%(,self.age))#單繼承classStudent(People):grade=''def__init__(self,n,a,w,g):#調(diào)用父類的構(gòu)造函數(shù)People.__init__(self,n,a,w)self.grade=g#覆寫父類的方法defspeak(self):print("%s說:我%d歲了,我在讀%d年級"%(,self.age,self.grade))#另一個類,多重繼承之前的準(zhǔn)備classSpeaker():topic=''name=''def__init__(self,n,t):=nself.topic=tdefspeak(self):print("我叫%s,我是一個演說家,我演講的主題是%s"%(,self.topic))

#多重繼承classSample(Speaker,Student):a=''def__init__(self,n,a,w,g,t):Student.__init__(self,n,a,w,g)Speaker.__init__(self,n,t)test=Sample("Tim",25,80,4,"Python")test.speak()#方法名同,默認(rèn)調(diào)用的是在括號中參數(shù)位置排前父類的方法上述代碼的執(zhí)行結(jié)果為:

我叫Tim,我是一個演說家,我演講的主題是Python。方法重寫方法重寫是指子類可以對從父類中繼承過來的方法進(jìn)行重新定義,從而使得子類對象可以表現(xiàn)出與父類對象不同的行為。代碼如下所示:classPerson: #定義Person類def__init__(self,name): #定義構(gòu)造方法=name #將self對象的name屬性賦為形參name的值defPrintInfo(self): #定義PrintInfo方法print('姓名:%s'%)classStudent(Person): #以Person類作為父類定義子類Studentdef__init__(self,sno,name):#定義構(gòu)造方法self.sno=sno #將self對象的sno屬性賦為形參sno的值=name #將self對象的name屬性賦為形參name的值defPrintInfo(self): #定義PrintInfo方法print('學(xué)號:%s,姓名:%s'%(self.sno,))if__name__=='__main__':p=Person('王剛')

#創(chuàng)建Person類對象pstu=Student('1741','王剛') #創(chuàng)建Student類對象stup.PrintInfo()stu.PrintInfo()上述代碼的執(zhí)行結(jié)果為:姓名:王剛學(xué)號:1741,姓名:王剛super()函數(shù)當(dāng)子類重寫了父類的方法后,子類對象將無法調(diào)用父類中的方法,為解決這個問題,Python專門提供了super()函數(shù)用以實(shí)現(xiàn)對父類方法的訪問。語法如下:super().方法名()super()函數(shù)的應(yīng)用示例,代碼如下所示:classPerson: #定義Person類def__init__(self,name): #定義構(gòu)造方法print('Person類構(gòu)造方法被調(diào)用!')=name#將self對象的name屬性賦為形參name的值classStudent(Person): #以Person類作為父類定義子類Studentdef__init__(self,sno,name): #定義構(gòu)造方法print('Student類構(gòu)造方法被調(diào)用!')super().__init__(name) #調(diào)用父類的構(gòu)造方法self.sno=sno#將self對象的sno屬性賦為形參sno的值classPostgraduate(Student): #以Student類作為父類定義子類Postgraduatedef__init__(self,sno,name,boss): #定義構(gòu)造方法print('Postgraduate類構(gòu)造方法被調(diào)用!')super().__init__(sno,name) #調(diào)用父類的構(gòu)造方法self.boss=boss#將self對象的tutor屬性賦為形參tutor的值if__name__=='__main__':pg=Postgraduate('1741','張三','李四') #創(chuàng)建Postgraduate類對象pgprint('學(xué)號:%s,姓名:%s,研究生導(dǎo)師:%s'%(pg.sno,,pg.boss))上述代碼的執(zhí)行結(jié)果為:Postgraduate類構(gòu)造方法被調(diào)用!Student類構(gòu)造方法被調(diào)用!Person類構(gòu)造方法被調(diào)用!學(xué)號:1741,姓名:張三,研究生導(dǎo)師:李四任務(wù)5實(shí)踐活動任務(wù)1面向?qū)ο笕蝿?wù)2類與對象任務(wù)3構(gòu)造方法與析構(gòu)方法任務(wù)4繼承實(shí)踐一:借書卡業(yè)務(wù)實(shí)際生活中,圖書借閱系統(tǒng)在由圖書卡持有人員打開時先顯示歡迎界面,之后圖書卡持有人員輸入管理員賬號與密碼,圖書借閱系統(tǒng)被啟動,啟動后進(jìn)入系統(tǒng)功能頁面,可觀察到該頁面中展示所有可辦理的業(yè)務(wù),包括開戶(1)、查詢(2)、借書(3)、還書(4)、退出(Q)等。用戶可根據(jù)自己需求選擇相應(yīng)業(yè)務(wù)的編號,并按照提示完成相應(yīng)的操作。1.實(shí)踐分析要實(shí)現(xiàn)圖書借閱系統(tǒng)需要用到5種對象,分別是管理員、圖書借閱機(jī)、借書卡、用戶、借書卡系統(tǒng)。因此,我們需要設(shè)計(jì)5個類承擔(dān)不同的職責(zé),關(guān)于這些類的說明如下:(1)借書卡系統(tǒng)類(HomePage):負(fù)責(zé)提供整個系統(tǒng)流程的相關(guān)操作,包括打印歡迎登錄界面和功能界面、接收用戶輸入、保存用戶數(shù)據(jù)等。(2)圖書借閱機(jī)類(BOOK):負(fù)責(zé)處理系統(tǒng)中各個功能的相關(guān)操作,包括開戶、查詢、借書、還書、退出功能。(3)管理員類(Administration):負(fù)責(zé)提供檢測管理員賬號與密碼、顯示歡迎登錄界面和功能界面的相關(guān)操作。(4)用戶類(User):負(fù)責(zé)提供用戶對象的相關(guān)操作。(5)借書卡(Card):負(fù)責(zé)提供借書卡對象的相關(guān)操作。2.代碼實(shí)現(xiàn)本實(shí)例的具體實(shí)現(xiàn)代碼如下所示:(1)創(chuàng)建一個名為“實(shí)踐活動”的文件夾。在該文件夾下創(chuàng)建5個.py文件,分別為admin.py、book.py、card.py、user.py與“借書卡系統(tǒng).py”。(2)在card.py文件中編寫Card類的代碼,具體實(shí)現(xiàn)代碼如下所示:classCard:def__init__(self,book_card,borrownum,returnnum,remain,cardPwd):self.borrownum=borrownumself.returnnum=returnnumself.remain=remainself.book_card=book_cardself.cardPwd=cardPwd(3)在user.py文件中編寫User類的代碼,具體實(shí)現(xiàn)代碼如下所示:classUser:def__init__(self,name,identity_card,phone,card):=nameself.id=identity_cardself.phone=phoneself.card=card(4)在admin.py文件中編寫Administrion類的代碼,具體實(shí)現(xiàn)代碼如下所示:classAdministration:adminUser='123'#管理員的賬號adpwd='123'#管理員的密碼defprintAdminView(self):print("******************************************")print("******")print("******")print("***歡迎登錄書店系統(tǒng)***")print("******")print("******")print("******************************************")defprintsysFunctionView(self):print("***********************************************")print("******")print("***1.開戶(1)2.查詢(2)***")print("***3.借書(3)4.還書(4)***")print("******")print("***退出(Q)***")print("******")print("***********************************************")defadminOption(self):adminInput=input("請輸入管理員賬戶:")ifself.adminUser!=adminInput:print("管理員賬戶輸入錯誤")return-1passwordInput=input("請輸入密碼:")ifself.adpwd!=passwordInput:print("輸入密碼有誤")return-1else:print("操作成功,請稍后")return0(5)在book.py文件中編寫B(tài)ook類的代碼。Book是本實(shí)例的核心類,該類中包含所有與系統(tǒng)功能相關(guān)的方法。由于Book類包含開戶的功能,在實(shí)現(xiàn)這些功能時需要訪問Card與User類的屬性,而且這些類分別處于不同的py文件中,因此這里需使用import語句導(dǎo)入Card和User類,此時便可以在Book類中訪問Card類與User類的屬性,具體實(shí)現(xiàn)代碼如下所示:fromuserimportUserfromcardimportCard下面分別介紹Book類的屬性與方法。alluser屬性在Book類的構(gòu)造方法中添加屬性alluser,具體實(shí)現(xiàn)代碼如下所示:classBook:def__init__(self,alluser):self.alluser=alluserrandomiCardId()方法randomiCardId()方法的作用是在用戶開戶時生成隨機(jī)圖書卡號,該方法中需要借助random模塊的函數(shù)生成隨機(jī)數(shù),也需要排除生成重復(fù)卡號的情況,具體實(shí)現(xiàn)代碼如下所示:importrandomdefrandomiCardId(self):#隨機(jī)生成開戶卡號whileTrue:str_data=''#存儲卡號foriinrange(8):#隨機(jī)生成8位卡號ch=chr(random.randrange(ord('0'),ord('9')+1))str_data+=chifnotself.alluser.get(str):#判斷卡號是否重復(fù)returnstr_datacreatUser()方法creatUser()方法用于為用戶開設(shè)賬戶,在該方法中需要用戶先根據(jù)提示信息依次輸入姓名、身份證號、手機(jī)號,再連續(xù)輸入兩次銀行卡的密碼(必須一致,否則因開戶失敗重新回到功能界面),最后隨機(jī)生成開戶卡號,根據(jù)該卡號創(chuàng)建卡信息和用戶信息,并將用戶的信息存儲到alluser中,具體實(shí)現(xiàn)代碼如下所示:defcreatUser(self):#辦新卡#目標(biāo)向用戶字典中添加一個鍵值對(卡號、用戶對象)name=input("請輸入姓名:")identity_card=input("請輸入身份證號:")phone=input("請輸入手機(jī)號:")book_card=self.randomiCardId()

remain=10borrownum=0returnnum=0oncePwd=input("請輸入密碼:")passWord=input("請?jiān)俅屋斎朊艽a:")ifpassWord!=oncePwd:print("兩次密碼輸入不同")return-1print("密碼設(shè)置成功,請牢記密碼:%s"%passWord)#創(chuàng)建卡card=Card(book_card,borrownum,returnnum,remain,oncePwd)user=User(name,identity_card,phone,card)#創(chuàng)建用戶self.alluser[book_card]=user#存入用戶字典print("您的開戶已完成,請牢記開戶賬號:%s"%book_card)checkpwg()方法creatUser()方法用于核對用戶輸入的密碼,且限定至多輸入3次,超過三次則返回False,輸入正確則返回True,具體實(shí)現(xiàn)代碼如下所示:defcheckpwg(self,Pwd): foriinrange(3):password=input("請輸入密碼:")ifPwd==password:returnTrueprint("密碼輸錯三次,系統(tǒng)自動退出")returnFalsesearchUser()方法searchUser()方法實(shí)現(xiàn)查詢圖書卡信息的功能,確保用戶在發(fā)生借書、還書行為之前能輸入正確的圖書卡號,此時打印該卡號及可借書數(shù)目,并返回?fù)碛性搱D書卡的用戶,否則返回-1,具體實(shí)現(xiàn)代碼如下所示:defsearchUser(self):#查詢圖書卡信息inptcardId=input("請輸入您的卡號:")user=self.alluser.get(inptcardId)#如果卡號不存在,下面代碼就會執(zhí)行ifnotself.alluser.get(inptcardId):print("此卡號不存在...查詢失?。?)return-1ifnotself.checkpwg(user.card.cardPwd):#驗(yàn)證密碼print("密碼錯誤過多...,請稍后使用!")return-1print("卡號:%s可借書數(shù):%d"%(user.card.book_card,user.card.remain))returnuserborrow()方法borrow()方法實(shí)現(xiàn)用戶使用借書卡系統(tǒng)借書的功能,該方法中首先需調(diào)用searchUser()方法根據(jù)用戶輸入的卡號返回?fù)碛性摽ǖ挠脩?,然后處理用戶輸入借書?shù)目的情況:若輸入的借書數(shù)目低于可借書數(shù)目,則將借書成功后的借書卡中已借書數(shù)目和可借書數(shù)目展示給用戶,同時提示借書成功;若輸入的借書數(shù)目高于可借書數(shù)目,則提示用戶信息并返回系統(tǒng)功能界面,具體實(shí)現(xiàn)代碼如下所示:defborrow(self):#借書userTF=self.searchUser()ifuserTF!=-1:ifuserTF.card.book_card!='':borrownum=int(input("請輸入借書數(shù)目:"))ifborrownum>userTF.card.remain:print("借出的書多于可借的書數(shù)目!")return-1userTF.card.remain=userTF.card.remain-borrownumuserTF.card.borrownum=userTF.card.borrownum+borrownumprint("借書成功!

卡號:%s共借過:%2d本"%(userTF.card.book_card,userTF.card.borrownum))print("借書成功!

卡號:%s還可借:%2d本"%(userTF.card.book_card,userTF.card.remain))else:return-1returnbook()方法returnbook()方法實(shí)現(xiàn)用戶使用借書卡管理系統(tǒng)還書的功能,與borrow()方法的功能類似,需要先查詢銀行卡的用戶,查詢結(jié)果無誤后則需要用戶輸入要還書的數(shù)目:還書數(shù)目小于0提示錯誤信息,并返回到銀行系統(tǒng)的功能界面;金額大于等于0則累加到借書卡的可借書目中,并向用戶展示可借書目和共借書數(shù)目,具體實(shí)現(xiàn)代碼如下所示:defreturnbook(self):#還書userTF=self.searchUser()ifuserTF!=-1:ifuserTF.card.book_card!='':returnnum=int(input("請輸入要還書的數(shù)量:"))ifreturnnum<0:print("請輸入正確數(shù)目")else:userTF.card.returnnum+=returnnumuserTF.card.remain+=returnnumprint("還書成功!

卡號:%s還可借本數(shù):%d"%(userTF.card.book_card,userTF.card.remain))print("還書成功!

卡號:%s共還過:%2d本"%(userTF.card.book_card,userTF.card.returnnum))else:return-1(6)在“借書卡系統(tǒng).py”文件中編寫HomePage類的代碼,具體實(shí)現(xiàn)代碼如下所示:fromadminimportAdministrationfrombookimportBookimporttime classHomePage:def__init__(self):self.allUserD={}#使用字典存儲數(shù)據(jù)self.book=Book(self.allUserD)self.admin=Administration()#管理員開機(jī)界面defsaveUser(self):self.allUserD.update(self.book.alluser)print("數(shù)據(jù)存盤成功")defmain(self):self.admin.printAdminView()resL=self.admin.adminOption()ifnotresL:whileTrue:self.admin.printsysFunctionView()option=input("請輸入您的操作:")ifoptionnotin("1","2","3","4","Q","q"):print("輸入操作項(xiàng)有誤,請仔細(xì)確認(rèn)!")time.sleep(1)ifoption=="1":#開戶self.book.creatUser()elifoption=="2":#查詢self.book.searchUser()elifoption=="3":#借書self.book.borrow()elifoption=="4":#還書self.book.returnbook()elifoption.upper()=="Q":ifnot(self.admin.adminOption()):self.saveUser()print('退出系統(tǒng)')return-1(7)在“借書卡系統(tǒng).py”在“借書卡系統(tǒng).py”文件中,創(chuàng)建HomePage類對象,調(diào)用main()函數(shù),具體實(shí)現(xiàn)代碼如下所示:if__name__=="__main__":homepage=HomePage()homepage.main()

至此,程序的全部功能都已實(shí)現(xiàn)。實(shí)戰(zhàn)二:銀行管理系統(tǒng)銀行是依法成立的經(jīng)營貨幣信貸業(yè)務(wù)的金融機(jī)構(gòu),是商品貨幣經(jīng)濟(jì)發(fā)展到一定階段的產(chǎn)物。隨著科技的發(fā)展,計(jì)算機(jī)技術(shù)早已在銀行中廣泛應(yīng)用。銀行管理系統(tǒng)是一個集開戶、查詢、取款、存款、轉(zhuǎn)賬、鎖定、解鎖、退出等一系列功能的管理系統(tǒng)。該系統(tǒng)中各功能的介紹如下:(1)開戶功能:用戶在ATM機(jī)上根據(jù)提示“請輸入姓名:”、“請輸入身份證號:”、“請輸入手機(jī)號:依次輸入姓名、身份證號、手機(jī)號、預(yù)存金額、密碼等信息,如果開戶成功,系統(tǒng)隨機(jī)生成一個不重復(fù)的6位數(shù)字卡號。(2)查詢功能:根據(jù)用戶輸入的卡號、密碼查詢卡中余額,如果連續(xù)3次輸入錯誤密碼,該卡號會被鎖定。(3)取款功能:首先根據(jù)用戶輸入的卡號、密碼顯示卡中余額。如果連續(xù)3次輸入錯誤密碼,該卡號會被鎖定;然后接收用戶輸入的取款金額,如果取款金額大于卡中余額或取款金額小于100系統(tǒng)進(jìn)行提示并返回功能頁面。(4)存款功能:首先根據(jù)用戶輸入的卡號、密碼顯示卡中余額,如果連續(xù)3次輸入錯誤密碼。該卡號會被鎖定,然后接收用戶輸入的存款金額;如果存款金額小于0,系統(tǒng)進(jìn)行提示并返回功能頁面。(5)轉(zhuǎn)賬功能:用戶需要分別輸入轉(zhuǎn)出卡號與轉(zhuǎn)入卡號,如果連續(xù)3次輸入錯誤密碼,卡號會被鎖定。當(dāng)輸入轉(zhuǎn)賬金額后,需要用戶再次確認(rèn)是否執(zhí)行轉(zhuǎn)賬功能;如果確定執(zhí)行轉(zhuǎn)賬功能后,轉(zhuǎn)出卡與轉(zhuǎn)入卡做相應(yīng)金額計(jì)算;如果取消轉(zhuǎn)賬功能,則返回之前操作。(6)鎖定功能:根據(jù)輸入的卡號、密碼執(zhí)行鎖定功能,鎖定之后該卡不能執(zhí)行查詢、取款、存款、轉(zhuǎn)賬等操作。(7)解鎖功能:根據(jù)輸入的卡號、密碼執(zhí)行解鎖功能,解鎖后的卡,能夠執(zhí)行查詢、取款、存款、轉(zhuǎn)賬等操作。(8)存盤功能:執(zhí)行存盤功能后,程序執(zhí)行的數(shù)據(jù)會寫入本地文件中。(9)退出功能:執(zhí)行退出功能時,需要輸入管理員的賬戶密碼。如果輸入的賬號密碼錯誤,則返回功能頁面:如果輸入的賬號密碼正確,則執(zhí)行存盤并退出系統(tǒng)。本實(shí)例要求編寫程序,實(shí)現(xiàn)一個具有上述功能的銀行管理系統(tǒng)。1.實(shí)踐分析要實(shí)現(xiàn)銀行管理系統(tǒng)需要銀行系統(tǒng)、admin、atm、用戶、銀行卡這五個部分組成。因此,我們需要設(shè)計(jì)5個部分承擔(dān)不同的職責(zé),關(guān)于這些內(nèi)容的說明如下:

(1)銀行管理系統(tǒng):負(fù)責(zé)提供整個系統(tǒng)流程的相關(guān)操作,包括打印歡迎登錄界面和功能界面、接收用戶輸入、保存用戶數(shù)據(jù)等。(2)管理類(admin):負(fù)責(zé)處理系統(tǒng)中各個功能的相關(guān)操作,包括銀行管理系統(tǒng)中的開戶、查詢、取款、存款、轉(zhuǎn)賬、鎖定、解鎖、退出等一系列功能。(3)atm類(atm):負(fù)責(zé)提供用戶在ATM機(jī)上根據(jù)提示“請輸人姓名:”、“請輸入身份證號:”、“請輸入手機(jī)號:依次輸入姓名、身份證號、手機(jī)號、預(yù)存金額、密碼等信息,如果開戶成功,系統(tǒng)隨機(jī)生成一個不重復(fù)的6位數(shù)字卡號。(4)用戶類(user):負(fù)責(zé)提供用戶對象的相關(guān)操作。(5)銀行卡(card):負(fù)責(zé)提供銀行卡對象的相關(guān)操作。2.代碼實(shí)現(xiàn)

本實(shí)例的具體實(shí)現(xiàn)代碼如下所示:(1)創(chuàng)建一個名為“實(shí)踐活動”的文件夾。在該文件夾下創(chuàng)建5個.py文件,分別為card.py、user.py、admin.py、atm.py和銀行系統(tǒng).py。(2)在card.py文件中編寫Card類的代碼,具體實(shí)現(xiàn)代碼如下所示:classCard:

def__init__(self,cardId,cardPwd,money):

self.cardId=cardId

self.cardPwd=cardPwd

self.money=money

self.cardLock=False(3)在user.py文件中編寫User類的代碼,具體實(shí)現(xiàn)代碼如下所示:classUser:

def__init__(self,name,id,phone,card):

=name

self.id=id

self.phone=phone

self.card=card(4)在admin.py文件中編寫Administrion類的代碼,具體實(shí)現(xiàn)代碼如下所示:classAdmin_bank:

adminU='1'

#管理員的賬號

adpwd='1'

#管理員的密碼

defpri

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論