爬蟲與Python:(二)Python基礎篇——13.類
Python中的類提供了面向物件變成的所有基本功能:類的繼承機制允許多個基類,派生類可以覆蓋基類中的任何方法,方法中呼叫類的同名方法。以下是本文將要學習的內容:
類的定義
定義類的語法格式如下:
1 class ClassName: 2 <statement-1> 3 ... 4 <statement-N>
類例項化後,可以使用其屬性,實際上,建立一個類之後,可以通過類名訪問其屬性。例如,定義一個學生類 Student。
1 class Student(): 2 def info(self): 3 print("測試方法")
類物件
類物件支援兩種操作:屬性引用和例項化。屬性引用使用Python中所有的屬性引用一樣的標準語法:obj.name。類物件建立後,類名稱空間中所有的命名都是有效屬性。所以,如果類定義為:
1 class MyClass: 2 """一個簡單的類例項""" 3 i = 12345 4 def f(self): 5 return "hello world" 6 7 # 例項化類 8 x = MyClass() 9 # 訪問類的屬性和方法 10 print("MyClass類的屬性i為:", x.i) 11 print("MyClass類的方法f輸出為:", x.f())
以上建立了一個新的例項並將該物件賦給區域性變數x, x為空的物件。
執行後控制檯會輸出:
MyClass類的屬性i為: 12345
MyClass類的方法f輸出為: hello world
類有一個名為__init__() 的特殊方法(構造方法),該方法在類例項化時會自動呼叫,具體如下:
1 def __init__(self): 2 self.data = []
類定義了__init__() 方法,類的例項化操作會自動呼叫__init__() 方法。如下列例項化MyClass對應的__init__方法就會被呼叫。
x = MyClass()
當然,__init__
1 class Complex: 2 def __init__(self, realpart , imagpart): 3 self.r = realpart 4 self.i = imagpart 5 x = Complex(3.0 , -4.5) 6 print(x.r , x.i) # 輸出結果: 3.0 -4.5
self代表類的例項,而非類,類的方法與普通的函式只有一個特別的區別——它們必須由一個額外的引數名稱,按照慣例她的名稱是self。
類方法
在類的內部,使用def關鍵字來定義一個方法,與一般的函式定義不同,類的方法必須包含引數self,且為第一個引數,self代表的是累的例項。
1 # 類定義 2 class people: 3 # 定義基本屬性 4 name = '' 5 age = 0 6 # 定義私有屬性,私有屬性在類外部無法直接訪問 7 __weight = 0 8 # 定義構造方法w 9 def __init__(self , n , a ,w): 10 self.name = n 11 self.age = a 12 self.__weight = w 13 def speak(self): 14 print("%s說:我%d歲"%(self.name , self.age)) 15 16 # 例項化類 17 p = people('runoob' , 10 ,30) 18 p.speak()
執行後控制檯輸出:runoob說:我10歲
繼承
Python同樣支援類的繼承——如果一種語言不支援繼承,類就沒有什麼意義。派生類的定義如下:
1 class DeriedClassName(BaseClassName1): 2 <statement-1> 3 ... 4 <statement-N>
需要注意的是,圓括號中基類的順序,若是基類中有相同的方法名,而在子類使用時未指定,Python從左到右搜尋,即方法在子類中未找到,從左到右查詢基類中是否包含該方法。
BaseClassName1(示例中基類名)必須與派生類定義在一個作用域內。除了類外,還可以用表示式,當基類定義在另一個模組中時這一點非常有用。
class DeriedClassName(modname.BaseClassName):
示例如下:
1 # 類定義 2 class people: 3 # 定義基本屬性 4 name = '' 5 age = 0 6 # 定義私有屬性,私有屬性在類外部無法直接訪問 7 __weight = 0 8 # 定義構造方法w 9 def __init__(self , n , a ,w): 10 self.name = n 11 self.age = a 12 self.__weight = w 13 def speak(self): 14 print("%s說:我%d歲"%(self.name , self.age)) 15 16 # 單繼承示例 17 class student(people): 18 grade = '' 19 def __init__(self , n , a, w ,g): 20 # 呼叫基類的建構函式 21 people.__init__(self, n, a ,w ) 22 self.grade = g 23 # 覆蓋基類的方法 24 def speak(self): 25 print("%s說:我%d歲了,我在讀%d年級" % (self.name, self.age , self.grade)) 26 27 # 例項化類 28 s = student('runoob',10,60,3) 29 s.speak()
執行後控制檯輸出: runoob說:我10歲了,我在讀3年級 。
有志者,事竟成,破釜沉舟,百二秦關終屬楚; 苦心人,天不負,臥薪嚐膽,三千越甲可吞吳。