這篇文章將介紹Python中類和對象的定義和使用方法。
在面向對象世界里,我們在描述事物時一般從靜態特征和動態特征兩個方面進行描述。比如描述一個人,年齡、發色、臉型、身高等這些屬于靜態特征,而說話、跑步、走路等,這些屬于動態特征。
在實際中,我們到底需要描述事物的那些特征,這跟我們要研究的問題領域有關,比如同樣一個人,他作為學生時,我們可能關注他的學號、姓名、年齡、班級、專業、學習年限等靜態特征,可能關注他的選課、考試、參加體育活動等動態特征;如果他作為一個職工,可能我們要關注他的職工號、姓名、年齡、工作年數、職級、入職時間等靜態特征,可能關注他的晉職、加薪、辭職、退休等動態特征。
在面向對象里,我們把事物的靜態特征稱為屬性,而把動態特征稱為行為。
我們把具有相同屬性和行為的事物定義為一個類。
對象屬于類的一個實例,也就是說對象是類的一個具體的內容。如定義了一個學生類,則一個具體的學生張三就是學生的一個實例。
類是產生對象的一個模板,使用類定義的對象具有相同的屬性和行為,只不過屬性的取值可能不同,行為產生的最終結果可能不同。
在具體的編程語言中,有時屬性也稱之為類的變量,而行為稱之為類的方法或類的函數。
在具體的編程語言中,一個類可能既有屬性又有方法,也可能只有屬性,也可能只有方法。
在Python中使用關鍵字class來定義一個類,其基本語法格式如下:
class className:
# 類的屬性或方法
上面className表示類的名稱,類的名稱一般是個名詞,在Python中類的名稱后緊跟一個冒號,然后在下面定義它的屬性或方法。
下面我們來定義個學生類。
class Student:
student_id = '00000'
student_name = '無名氏'
def haveLesson(self):
print(f'{self.student_id}的姓名是:{self.student_name}')
print(f'{self.student_name}正在上課。')
上面這個例子定義了一個學生類,在里面定義了兩個變量,student_id和student_name并給出了默認值。由于Python中的變量無需事先定義直接可以使用,則如果定義的話必須給出一個值來。
haveLesson屬于類中定義的一個方法(函數),它跟定義普通方法的方式沒有什么區別,不過類中的每個方法都有一個參數self,它表示調用當前方法的類的對象實例。haveLesson()方法中用于輸出兩行信息。
在使用這個類定義對象時,所有對象在其兩個屬性上的取值都相同的。
下面這個例子在上面例子的基礎上來定義實例并演示具體使用方法。
s1 = Student()
s1.haveLesson()
s1.student_id = '10011'
s1.student_name = '武林網'
s1.haveLesson()
上面這個例子演示了創建類對象的方法,Python跟其他面向對象語言不同,在定義實例(對象)時,直接使用s1 = Student()即可,無需使用new。
上面這個例子也演示了對象使用其屬性和方法的形式。
其輸出結果如下:
00000的姓名是:無名氏
無名氏正在上課。
10011的姓名是:武林網
武林網正在上課。
類的構造器又稱類的構造函數或構造方法。Python中定義構造函數的方式與其它面向對象語言也不相同,它使用__init__()實現。
比如上面學生類的例子,使用它定義的每個對象都具有相同的student_id和student_name取值,如何在定義實例時獲得不同的取值呢?這就需要借助類的構造器了。
下面這個例子對上面的例子進行了改寫。
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', '武林網')
s1.haveLesson()
s2 = Student('10012', '優雅的代碼')
s2.haveLesson()
其運行結果如下:
10011的姓名是:武林網
武林網正在上課。
10012的姓名是:優雅的代碼
優雅的代碼正在上課。
Python與其它面向對象編程語言不同的是,它不支持類構造函數的重載,即Python不支持在類中定義多個構造函數。最后一個定義的構造函數將會覆蓋掉前面定義的構造函數,同時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()
其運行結果如下:
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'
從結果可以看出,因為最后定義的構造函數是帶2個參數的,因此在定義實例時使用1個參數將會給出TypeError錯誤。
新聞熱點
疑難解答