這篇文章將介紹Python中類和對(duì)象的定義和使用方法。
在面向?qū)ο笫澜缋铮覀冊(cè)诿枋鍪挛飼r(shí)一般從靜態(tài)特征和動(dòng)態(tài)特征兩個(gè)方面進(jìn)行描述。比如描述一個(gè)人,年齡、發(fā)色、臉型、身高等這些屬于靜態(tài)特征,而說話、跑步、走路等,這些屬于動(dòng)態(tài)特征。
在實(shí)際中,我們到底需要描述事物的那些特征,這跟我們要研究的問題領(lǐng)域有關(guān),比如同樣一個(gè)人,他作為學(xué)生時(shí),我們可能關(guān)注他的學(xué)號(hào)、姓名、年齡、班級(jí)、專業(yè)、學(xué)習(xí)年限等靜態(tài)特征,可能關(guān)注他的選課、考試、參加體育活動(dòng)等動(dòng)態(tài)特征;如果他作為一個(gè)職工,可能我們要關(guān)注他的職工號(hào)、姓名、年齡、工作年數(shù)、職級(jí)、入職時(shí)間等靜態(tài)特征,可能關(guān)注他的晉職、加薪、辭職、退休等動(dòng)態(tài)特征。
在面向?qū)ο罄铮覀儼咽挛锏撵o態(tài)特征稱為屬性,而把動(dòng)態(tài)特征稱為行為。
我們把具有相同屬性和行為的事物定義為一個(gè)類。
對(duì)象屬于類的一個(gè)實(shí)例,也就是說對(duì)象是類的一個(gè)具體的內(nèi)容。如定義了一個(gè)學(xué)生類,則一個(gè)具體的學(xué)生張三就是學(xué)生的一個(gè)實(shí)例。
類是產(chǎn)生對(duì)象的一個(gè)模板,使用類定義的對(duì)象具有相同的屬性和行為,只不過屬性的取值可能不同,行為產(chǎn)生的最終結(jié)果可能不同。
在具體的編程語言中,有時(shí)屬性也稱之為類的變量,而行為稱之為類的方法或類的函數(shù)。
在具體的編程語言中,一個(gè)類可能既有屬性又有方法,也可能只有屬性,也可能只有方法。
在Python中使用關(guān)鍵字class來定義一個(gè)類,其基本語法格式如下:
class className:
# 類的屬性或方法
上面className表示類的名稱,類的名稱一般是個(gè)名詞,在Python中類的名稱后緊跟一個(gè)冒號(hào),然后在下面定義它的屬性或方法。
下面我們來定義個(gè)學(xué)生類。
class Student:
student_id = '00000'
student_name = '無名氏'
def haveLesson(self):
print(f'{self.student_id}的姓名是:{self.student_name}')
print(f'{self.student_name}正在上課。')
上面這個(gè)例子定義了一個(gè)學(xué)生類,在里面定義了兩個(gè)變量,student_id和student_name并給出了默認(rèn)值。由于Python中的變量無需事先定義直接可以使用,則如果定義的話必須給出一個(gè)值來。
haveLesson屬于類中定義的一個(gè)方法(函數(shù)),它跟定義普通方法的方式?jīng)]有什么區(qū)別,不過類中的每個(gè)方法都有一個(gè)參數(shù)self,它表示調(diào)用當(dāng)前方法的類的對(duì)象實(shí)例。haveLesson()方法中用于輸出兩行信息。
在使用這個(gè)類定義對(duì)象時(shí),所有對(duì)象在其兩個(gè)屬性上的取值都相同的。
下面這個(gè)例子在上面例子的基礎(chǔ)上來定義實(shí)例并演示具體使用方法。
s1 = Student()
s1.haveLesson()
s1.student_id = '10011'
s1.student_name = '武林網(wǎng)'
s1.haveLesson()
上面這個(gè)例子演示了創(chuàng)建類對(duì)象的方法,Python跟其他面向?qū)ο笳Z言不同,在定義實(shí)例(對(duì)象)時(shí),直接使用s1 = Student()即可,無需使用new。
上面這個(gè)例子也演示了對(duì)象使用其屬性和方法的形式。
其輸出結(jié)果如下:
00000的姓名是:無名氏
無名氏正在上課。
10011的姓名是:武林網(wǎng)
武林網(wǎng)正在上課。
類的構(gòu)造器又稱類的構(gòu)造函數(shù)或構(gòu)造方法。Python中定義構(gòu)造函數(shù)的方式與其它面向?qū)ο笳Z言也不相同,它使用__init__()實(shí)現(xiàn)。
比如上面學(xué)生類的例子,使用它定義的每個(gè)對(duì)象都具有相同的student_id和student_name取值,如何在定義實(shí)例時(shí)獲得不同的取值呢?這就需要借助類的構(gòu)造器了。
下面這個(gè)例子對(duì)上面的例子進(jìn)行了改寫。
class Student:
def __init__(self, sid, sname):
self.student_id = sid
self.student_name = sname
def haveLesson(self):
print(f'{self.student_id}的姓名是:{self.student_name}')
print(f'{self.student_name}正在上課。')
s1 = Student('10011', '武林網(wǎng)')
s1.haveLesson()
s2 = Student('10012', '優(yōu)雅的代碼')
s2.haveLesson()
其運(yùn)行結(jié)果如下:
10011的姓名是:武林網(wǎng)
武林網(wǎng)正在上課。
10012的姓名是:優(yōu)雅的代碼
優(yōu)雅的代碼正在上課。
Python與其它面向?qū)ο缶幊陶Z言不同的是,它不支持類構(gòu)造函數(shù)的重載,即Python不支持在類中定義多個(gè)構(gòu)造函數(shù)。最后一個(gè)定義的構(gòu)造函數(shù)將會(huì)覆蓋掉前面定義的構(gòu)造函數(shù),同時(shí)Python不給出任何提示。如下面的例子:
class Student:
def __init__(self, sid):
self.student_id = sid
def __init__(self, sid, sname):
self.student_id = sid
self.student_name = sname
def haveLesson(self):
print(f'{self.student_name}({self.student_id})在上課.')
s1 = Student('10011')
s1.haveLesson()
其運(yùn)行結(jié)果如下:
Traceback (most recent call last):
File "D:/Py/classInPython.py", line 12, in <module>
s1 = Student('10011')
TypeError: Student.__init__() missing 1 required positional argument: 'sname'
從結(jié)果可以看出,因?yàn)樽詈蠖x的構(gòu)造函數(shù)是帶2個(gè)參數(shù)的,因此在定義實(shí)例時(shí)使用1個(gè)參數(shù)將會(huì)給出TypeError錯(cuò)誤。
新聞熱點(diǎn)
疑難解答
圖片精選