Python程序开发——第六章 类与对象
目錄
- 一、類
- (一)類、對象
- (二)類的定義
- (三)對象的創(chuàng)建和使用
- 二、限制對象訪問
- (一)定義私有成員、方法
- (二)訪問私有成員、方法
- 三、構(gòu)造方法和析構(gòu)方法
- (一)構(gòu)造方法
- (二)析構(gòu)方法
- 四、類方法和靜態(tài)方法
- (一)類方法
- (二)靜態(tài)方法
- 五、繼承
- (一)多繼承
- (二)派生類方法重寫
- (三)super()函數(shù)
- 六、多態(tài)
一、類
(一)類、對象
Python是一種面向?qū)ο笳Z言,面向?qū)ο笥袃蓚€概念,分別是類和對象。
類是對多個對象的共同特征的抽象描述,可以說類是對象的模板。
對象是類的實例,用于描述現(xiàn)實中的個體。
(二)類的定義
根據(jù)類與對象的關(guān)系,我們知道創(chuàng)建對象之前需先定義類,類中可以定義數(shù)據(jù)成員和成員函數(shù),前者用于描述對象特征,稱為屬性,后者用于描述對象行為,稱為方法,類中的方法的第一個參數(shù)必須為self,這種方法也叫實例方法,只能通過類實例化的對象進(jìn)行調(diào)用。
class 類的名稱屬性名稱=屬性值def 方法名稱(self): #self是一個指向?qū)ο蟮哪J(rèn)參數(shù),類中必須包含參數(shù) self, 且為第一個參數(shù)。方法體例如,下列代碼定義了一個類,名稱為Way,該類包含一個屬性number_way、一個方法world():
class Way:number_way = 3def world(self):print("hello world!")(三)對象的創(chuàng)建和使用
創(chuàng)建對象:
對象名稱=類名稱()訪問對象成員:
對象名稱.屬性 對象名稱.方法()例如,創(chuàng)建一個Way類的對象a,訪問該對象成員:
class Way:number_way = 3def world(self):print("hello world!")a = Way() print(a.number_way) a.world()輸出結(jié)果如下:
二、限制對象訪問
(一)定義私有成員、方法
定義類中的屬性和方法默認(rèn)為公有屬性和公有方法,該類中的對象可以任意訪問類中的公有成員和公有方法,可以通過將成員和方法定義為私有,即私有成員和私有方法,從而限制對象對類的訪問。
通過在類成員名稱或類方法名稱前面加上雙下劃線__限制成員的訪問,即定義為私有成員和私有方法,如下:
class Way:__number_way = 3def __world(self):print("hello world!")(二)訪問私有成員、方法
這里要注意,實例化的對象是無法直接訪問類中的私有成員和私有方法的,它們都可通過公有方法中的參數(shù)self調(diào)用。
例如,下列python代碼,定義了一個私有成員__number_way和一個私有方法__world()以及一個公有方法get_way():
輸出結(jié)果如下:
三、構(gòu)造方法和析構(gòu)方法
類中有兩個名為 __init__() 和__del__()的特殊方法,它們分別是構(gòu)造方法和析構(gòu)方法,該兩種方法在類創(chuàng)建和銷毀時會自動調(diào)用。
(一)構(gòu)造方法
每個定義的類中都有一個默認(rèn)的__init__()構(gòu)造方法,如果在定義類時未定義,則系統(tǒng)會調(diào)用默認(rèn)的構(gòu)造方法,而如果用戶在定義時顯式地定義了構(gòu)造方法,則會調(diào)用該定義的構(gòu)造方法。
可以通過無參構(gòu)造方法和有參構(gòu)造方法來分別對該方法創(chuàng)建的對象賦予相同的初始值和不同的初始值。
注:這里按照參數(shù)的有無分為兩種構(gòu)造方法,但除了self,因為類中必須包含參數(shù) self, 且為第一個參數(shù)。
下列python代碼,Triangle類中顯式地定義了帶參數(shù)的構(gòu)造方法和一個get_s()方法:
class Triangle:def __init__(self, bottom, high):self.bottom = bottomself.high = highdef get_s(self):s = (self.bottom * self.high) / 2.0print(f"三角形的面積為:{s}")S = Triangle(1.5, 2) print(S.bottom, S.high) S.get_s()運(yùn)行結(jié)果如下:
(二)析構(gòu)方法
對象被清理時,系統(tǒng)會自動調(diào)用析構(gòu)方法,即對象在內(nèi)存中被釋放時自動觸發(fā)執(zhí)行__del__()析構(gòu)方法。
下列python代碼,Triangle類中顯式地定義了帶參數(shù)的構(gòu)造方法和一個get_s()方法以及一個析構(gòu)方法,析構(gòu)方法打印輸出__del__()方法被調(diào)用:
運(yùn)行結(jié)果如下,可知道對象在被銷毀時自動調(diào)用了__del__()析構(gòu)方法:
四、類方法和靜態(tài)方法
(一)類方法
類方法通過裝飾器@classmethod修飾,它的第一個參數(shù)并非類本身self,而是cls。
與實例方法不一樣,它既可由類實例化的對象調(diào)用,也可由類調(diào)用,且類方法可以修改類屬性,而實例方法不能。
如下代碼,通過對象名稱調(diào)用類方法,直接通過類調(diào)用類方法且通過類方法修改類屬性word的值:
運(yùn)行結(jié)果如下:
(二)靜態(tài)方法
首先靜態(tài)方法與類方法一樣,既可由類實例化的對象調(diào)用,也可由類調(diào)用。靜態(tài)方法沒有self參數(shù),是通過裝飾器@classmethod修飾。
由于沒有默認(rèn)參數(shù),所以它無法使用默認(rèn)參數(shù)來訪問類成員。
下列python代碼:
運(yùn)行結(jié)果如下:
五、繼承
類和類可以繼承,繼承(派生)的類的稱為派生類或子類,被繼承的類稱為基類或父類。
由于是繼承下來的,所以派生類具有基類的所有屬性和方法,繼承的格式如下:
例如,下列python代碼,定義了基類Employee和子類teacher,通過class Teacher(Employee)來繼承基類Employee中的屬性和方法,另外派生類中還有自己定義的屬性和方法:
class Employee:place = "office"def get_word(self):print(f"{self.place}")class Teacher(Employee): # 繼承Employee類student_num = 50 # 子類自己定義的屬性def get_word_num(self): # 子類自己定義的方法print(f"教師辦公地點為{self.place}")print(f"學(xué)生人數(shù)為{self.student_num}")A = Teacher() print(Teacher.place) # 子類繼承了父類的屬性,所以子類有父類的屬性 A.get_word() # 子類繼承了父類的方法,所以子類有父類的方法 print(Teacher.student_num) # 輸出子類自己定義的屬性 A.get_word_num() # 調(diào)用子類自己定義的方法輸出結(jié)果如下,可以看出繼承基類后,派生類既可以調(diào)用自己的方法,也能調(diào)用所繼承基類中的方法:
(一)多繼承
多繼承指一個派生類繼承多個基類,多繼承的格式為class 派生類(基類1,基類2……)。
(二)派生類方法重寫
當(dāng)基類中的方法無法滿足派生類中的要求時,可以重寫基類的方法,重寫后的基類原方法并未改變。
例如下列python代碼,派生類teacher中重寫基類中的get_word()方法:
運(yùn)行結(jié)果如下,重寫基類中的get_word()方法后,并未改變該方法:
(三)super()函數(shù)
可以通過super()函數(shù),在派生類重寫基類的方法后,仍可調(diào)用基類中的方法。
下列python代碼:
運(yùn)行結(jié)果如下,可以看到通過super()函數(shù)調(diào)用已經(jīng)被派生類teacher重寫的基類方法get_word():
六、多態(tài)
多態(tài)指不考慮對象類型并使用該對象,讓具有不同功能的函數(shù)使用相同的函數(shù)名稱,從而通過函數(shù)名稱調(diào)用不同功能的函數(shù)。
下列python代碼,通過Person類中的get_word()方法中的name參數(shù),傳給name參數(shù)是目標(biāo)類的實例對象即調(diào)用該類的get_word()方法:
運(yùn)行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的Python程序开发——第六章 类与对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (*长期更新)软考网络工程师学习笔记——
- 下一篇: Python程序开发——第七章 模块与包