1. 程式人生 > 其它 >爬蟲與Python:(二)Python基礎篇——13.類

爬蟲與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__

() 方法可以有引數,引數通過 __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年級

有志者,事竟成,破釜沉舟,百二秦關終屬楚; 苦心人,天不負,臥薪嚐膽,三千越甲可吞吳。