




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
郭煒信息科學技術學院1
微博:/guoweiofpku
學會程序和算法,走遍天下都不怕!實用Python程序設計面向對象程序設計信息科學技術學院2信息科學技術學院郭煒
類和對象大同火山群為什么需要"類"用列表或元組表示學生信息:student=["張三",20001807,3.4,"1988-01-24"]記不住GPA到底下標是多少student[3]=XXXX也不知道是對哪項數(shù)據(jù)賦值4類和對象的概念類是用來代表事物的。對一種事物,可以設計一個類,概括出該種事物的屬性,用成員變量表示之;還要概括該種事物事物能進行的操作,用成員函數(shù)表示之。成員變量也稱為類的“屬性”,成員函數(shù)也稱為類的“方法”。類的實例,稱為“對象”。類代表一種事物的共同特點,對象就是一個具體的事物個體。生成對象的方法:類名(參數(shù)1,參數(shù)2......)5類的寫法class類名: def__init__(self,參數(shù)1,參數(shù)2......):
...... def成員函數(shù)1(self,參數(shù)1,參數(shù)2......):
...... def成員函數(shù)2(self,參數(shù)1,參數(shù)2......):
........ def成員函數(shù)n(self,參數(shù)1,參數(shù)2......):
.....6矩形類示例classrectangle:def__init__(self,w,h):#構造函數(shù),每個類必有self.w,self.h=w,hdefarea(self):returnself.w*self.hdefperimeter(self):return2*(self.w+self.h)7矩形類示例defmain():w,h=map(int,input().split()) #假設輸入23rect=rectangle(w,h)#生成一個rectangle對象print(rect.area(),rect.perimeter()) #>>610rect.w,rect.h=10,20print(rect.area(),rect.perimeter()) #>>20060rect2=rectangle(2,3)print(rect2.area(),rect2.perimeter()) #>>610main()8類的作用將數(shù)據(jù)和操作數(shù)據(jù)的函數(shù)捆綁在一起,便于當作一個整體使用9Python中的類類型名即是類名:
float,str,list,dict.....小數(shù)、復數(shù)、字符串、元組、列表、集合、字典等組合數(shù)據(jù)類型的常量,都是對象,函數(shù)也是對象,但整數(shù)型常量不是對象各種庫都是由類組成:turtle、matplotlib、jieba、sqlite3程序員可以自定義類,如rectangle10信息科學技術學院郭煒
對象的比較大同城墻對象的比較Python中所有的類,包括自定義的類,都有__eq__方法。x==y的值,就是x.__eq__(y)的值;如果x.__eq__(y)沒定義,那么就是y.__eq__(x)的值。如果x.__eq__(y)和y.__eq__(x)都沒定義,則x==y也沒定義(x,y都是整數(shù)常量時不適用)print(24.5.__eq__(24.5))#>>True12對象的比較a!=b 等價于
a.__ne__(b),或b.__ne__(a)(若a.__ne__(b)沒定義)默認情況下,a.__ne__(b)等價于nota.__eq__(b)a<b
等價于 a.__lt__(b)a>b 等價于 a.__gt__(b)a<=b 等價于 a.__le__(b)a>=b 等價于 a.__ge__(b)13自定義對象的比較默認情況下,一個自定義類的__eq__方法,功能是判斷兩個對象的id是否相同。默認情況下,一個自定義類的兩個對象a和b,a==b和aisb的含義一樣,都是“a和b是否指向相同的地方”。同理,a!=b和notaisb含義相同。默認情況下,自定義類的對象不能比較大小,因其__lt__、__gt__、__le__、__ge__方法都被設置成了None14對象比較大小程序示例classpoint:def__init__(self,x,y=0):self.x,self.y=x,ydef__eq__(self,other):returnself.x==other.xandself.y==other.ydef__lt__(self,other): #使得兩個point對象可以用<進行比較
ifself.x==other.x:returnself.y<other.yelse:returnself.x<other.x15對象比較大小程序示例a,b=point(1,2),point(1,2)print(a==b) #>>True等價于a.__eq__(b)print(a!=b) #>>Falseprint(a<point(0,1)) #>>False等價于a.__lt__(point(0,1))print(a<point(1,3)) #>>Truelst=[a,point(-2,3),point(7,8),point(5,9),point(5,0)]lst.sort()forpinlst: #>>-23,12,50,59,78,print(p.x,p.y,end=",")16輸出對象自定義類重寫__str__方法可以將對象轉字符串classpoint:def__init__(self,x,y):self.x,self.y=x,ydef__str__(self):return("(%d,%d)"%(self.x,self.y))print(point(3,5))
#>>(3,5)print(str(point(2,4))) #>>(2,4)17信息科學技術學院郭煒
繼承和派生祁連山繼承和派生要寫小學生類、中學生類、大學生類....所有學生都有共同點,每種學生又有各自特點,如何避免每個類都從頭編寫的重復勞動?19繼承和派生要寫小學生類、中學生類、大學生類....所有學生都有共同點,每種學生又有各自特點,如何避免每個類都從頭編寫的重復勞動?使用繼承(派生)20繼承和派生定義一個新的類B時,如果發(fā)現(xiàn)類B擁有某個已寫好的類A的全部特點,此外還有類A沒有的特點,那么就不必從頭重寫類B,而是可以把A作為一個“基類”(也稱“父類”),把B寫為基類A的一個“派生類”(也稱“子類”)來寫。這樣,就可以說從A類“派生”出了B類,也可以說B類“繼承”了A類。class類名(基類名): ......21繼承和派生importdatetimeclassstudent:def__init__(self,id,name,gender,birthYear):self.id,,self.gender,self.birthYear=\id,name,gender,birthYeardefprintInfo(self):print("Name:",)print("ID:",self.id)print("BirthYear:",self.birthYear)print("Gender:",self.gender)print("Age:",self.countAge())defcountAge(self):returndatetime.datetime.now().year-self.birthYear22繼承和派生classundergraduateStudent(student):#本科生類,繼承了student類
def__init__(self,id,name,gender,birthYear,department):student.__init__(self,id,name,gender,birthYear)self.department=departmentdefqualifiedForBaoyan(self): #給予保研資格
print(+"isqualifiedforbaoyan")defprintInfo(self): #基類中有同名方法
student.printInfo(self) #調用基類的PrintInfo
print("Department:",self.department)defmain():s2=undergraduateStudent("118829212","HarryPotter",
"M",2000,"ComputerScience")s2.printInfo()s2.qualifiedForBaoyan()ifs2.countAge()>18:print(,"isolderthan18")main()23繼承和派生輸出:Name:HarryPotterID:118829212BirthYear:2000Gender:MAge:20Department:ComputerScienceHarryPotterisqualifiedforbaoyanHarryPotterisolderthan1824object類所有類都是object類的派生類,因而具有object類的各種屬性和方法classA:deffunc(x):passprint(dir(A))#輸出A的方法輸出:['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','func']有的類_lt__,__gt__等方法被設置成None,于是對象不可比較大小25信息科學技術學院郭煒
靜態(tài)屬性和
靜態(tài)方法草原天路靜態(tài)屬性和靜態(tài)方法靜態(tài)屬性被所有對象所共享,一共只有一份靜態(tài)方法不是作用在具體的某個對象上的,不能訪問非靜態(tài)屬性靜態(tài)屬性和靜態(tài)方法這種機制存在的目的,就是為了少寫全局變量和全局函數(shù)。27靜態(tài)屬性和靜態(tài)方法classemployee:totalSalary=0 #靜態(tài)屬性,記錄發(fā)給員工的工資總數(shù)
def__init__(self,name,income):,self.income=name,incomedefpay(self,salary):self.income+=salaryemployee.totalSalary+=salary@staticmethod
defprintTotalSalary(): #靜態(tài)方法
print(employee.totalSalary)28靜態(tài)屬性和靜態(tài)方法e1=employee("Jack",0)e2=employee("Tom",0)e1.pay(100)e2.pay(200)employee.printTotalSalary() #>>300e1.printTotalSalary() #>>300e2.printTotalSalary() #>>300print(employee.totalSalary) #>>30029信息科學技術學院郭煒
對象作為
集合元素或字典的鍵福建寧德太姥山什么是“可哈?!笨晒5臇|西,才可以作為字典的鍵和集合的元素hash(x)有定義,即為x可哈希hash(x)=x(如果x是整型常量)hash(x)=x.__hash___()(如果x不是整型常量)object類有__hash__()方法,返回值是個整數(shù)31什么是“可哈希”列表、集合、字典的__hash__成員函數(shù)都被設置成None,因此它們都不能成為集合的元素,或者字典的鍵,因為無法計算哈希值。32什么是“可哈?!闭麛?shù)類型變量、小數(shù)、字符串、元組的哈希值,是根據(jù)它們的值算出來的,只要值相同,哈希值就相同。x=23.1print(x.__hash__(),23.1.__hash__())#>>230584300921372695230584300921372695x=23print(x.__hash__(),hash(23)) #>>2323x=(1,2)print(x.__hash__(),(1,2).__hash__(),hash(x))#>>371308163193441065637130816319344106563713081631934410656x="ok"print(x.__hash__(),"ok".__hash__())#>>-423760875654480603-42376087565448060333哈希值和字典、集合的關系字典和集合都是“哈希表”數(shù)據(jù)結構,根據(jù)元素的哈希值為元素找存放的“槽”,哈希值可以看作是槽編號。一個槽里面可以放多個哈希值相同的元素。兩個對象a,b若hash(a)!=hash(b),則a,b可以處于同一集合(也可以作為同一字典的不同元素的鍵)兩個對象a,b若hash(a)==hash(b),但a==b不成立,則a,b可以處于同一集合(也可以作為同一字典的不同元素的鍵),即不算重復,可以放在同一個槽里34哈希值和字典、集合的關系若dt是個字典,dt[x]計算過程如下:根據(jù)hash(x)去找x應該在的槽的編號如果該槽沒有元素,則認為dt中沒有鍵為x的元素如果該槽中有元素,則試圖在槽中找一個元素y,使得y的鍵==x。如果找到,則dt[x]即為y的值,如果找不到,則dt[x]沒定義,即認為dt中不存在鍵為x的元素35哈希值和字典、集合的關系自定義類的對象,默認情況下哈希值是根據(jù)對象id進行計算。所以兩個對象,只要aisb不成立,a和b的哈希值就不同,就可以同時存在于一個集合內(nèi),或作為同一字典的不同元素的鍵。可以重寫自定義類的__hash__()方法,使得對象的哈希值和對象的值,而不是id相關,這樣值相同的對象,就不能處于同一個集合中,也不能作為同一字典不同元素的鍵。36哈希值和字典、集合的關系classA:def__init__(self,x):self.x=xa,b=A(5),A(5) #兩個A(5)不是同一個,因此a和b的id不同dt={a:20,A(5):30,b:40} #三個元素的鍵id不同,因此在不同槽里print(len(dt),dt[a],dt[b])#>>32040print(dt[A(5)]) #runtimeerror37哈希值和字典、集合的關系classA:def__init__(self,x):self.x=xa,b=A(5),A(5) #兩個A(5)不是同一個,因此a和b的id不同dt={a:20,A(5):30,b:40} #三個元素的鍵id不同,因此在不同槽里print(len(dt),dt[a],dt[b])#>>32040print(dt[A(5)]) #runtimeerror38自定義類的對象是否可哈希a==b等價于a.__eq__(b)。自定義類的默認__eq__函數(shù)是判斷兩個對象的id是否相同。自定義類的默認__hash__函數(shù)是根據(jù)對象id算哈希值的。如果為自定義的類重寫了__eq__(self,other)成員函數(shù),則其__hash__成員函數(shù)會被自動設置為None。這種情況下,該類就變成不可哈希的一個自定義類,只有在重寫了__eq__方法卻沒有重寫__hash__方法的情況下,才是不可哈希的。39自定義類重寫__hash___但不重寫__eq__classA:def__init__(self
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漢字筆順的課件
- 漢字的構造及分類課件
- 廣東省肇慶市2024-2025學年高二下學期期末考試物理試題(含答案)
- 工廠車間承包合同(5篇)
- 2024-2025學年廣東省揭陽市普寧市二中七年級(下)第一次月考數(shù)學試卷(含答案)
- 《史記》的當代價值轉換知到智慧樹答案
- 年度個人先進工作總結
- 《Android移動應用開發(fā)基礎》知到智慧樹答案
- 能源環(huán)保產(chǎn)業(yè)前景分析報告
- 2024年秋新北師大版數(shù)學一年級上冊 第四單元 一起做游戲 教學課件
- 《石膏的護理》課件
- 護理法律相關案例分析
- 2025版《折彎機安全操作規(guī)程》全
- 2024版標準性二手車貸款合同模板(含車況鑒定)3篇
- 孕期陰道炎的健康宣教
- DB32-T 4467-2023 南美白對蝦小棚養(yǎng)殖尾水生態(tài)化處理技術規(guī)程
- 31個工種安全技術交底
- 人工智能概論課件完整版
- 管道承諾質量保證書范本
- 門窗訂購電子合同模板
- 渠道襯砌施工方案(渠道預制混凝土塊)
評論
0/150
提交評論