創建類
類的定義以關鍵字class開頭,之后跟着一個名字(用戶定義)來標識這個類,並且以冒號結尾。類的內容以縮進(4個空格)表示,如下例的pass表示什么事情也不做。
Python命名規則(以字母或者下划線開頭,名字只能含有字母、下划線或者數字)。一般使用駝峰式命名(以大寫字母開頭,並且隨后緊跟的任意個單詞,這些單詞都要以大寫字母開頭)。
class MyFirstClass: pass
將上述的代碼保存為first_class.py文件,然后運行命令python -i first_class.py。參數-i表示在交互式解釋器運行這個腳本。
$ python -i first_class.py >>> a = MyFirstClass() >>> print(a) <__main__.MyFirstClass object at 0x103fd7e80> >>> b = MyFirstClass() >>> print(b) <__main__.MyFirstClass object at 0x103fd7eb8>
上述實例化了兩個對象a和b。鍵入類的名字並緊跟一對小括號。
添加屬性
可以通過點記法給一個實例化的對象賦予任意屬性,點記法形式為<object>.<attribute> = <value>來為屬性賦值,這個值可以是任意的,如python內置的數據類型、其他的對象甚至是一個函數或者是另一個類。
class Point: pass p1 = Point() p2 = Point() p1.x = 5 p1.y = 4 p2.x = 3 p2.y = 6 print(p1.x, p1.y) print(p2.x, p2.y)
這段代碼創建了一個沒有任何數據和行為的Point 類。然后創建了這個Point類的兩個實例,並且給每個實例賦予一個x坐標和一個y坐標。運行如上的代碼會得到如下的結果。
5 4 3 6
讓類實際做一些事情
上面我們已經可以讓一個對象帶有屬性,接下來是通過激發一些行為來引起這些屬性的變化。在Point類里面添加了一個reset方法,該方法是將點移到原點(該方法不需要用到參數,是個很好的例子)。
class Point: def reset(self): self.x = 0 self.y = 0 p = Point() p.x = 5 p.y = 4 print(p.x, p.y) # 5 4 p.reset() print(p.x, p.y) # 0 0
python中的方法(method)定義和函數(function)基本相同,方法可以操作對象本身和任意傳入的參數。方法與函數不同的是,所有的方法都有一個必須的參數,這個參數通常被稱為self,若忘記,引用該方法時會出現報錯。一個方法中的self參數,是對調用這個方法的對象的一個引用,我們可以和其他對象一樣訪問這個對象的屬性和方法。當要改變self對象的x和y屬性值時,通過調用內部的reset方法實現。
當調用p.reset(),並沒有給它傳入self參數,python會自動將這個對象傳給了該方法。
方法只是一個函數而已,只不過恰巧出現在類中。除了可以直接調用一個對象的方法以外,我們也可以在類中調用這個函數,並且明確可以將這個對象作為self參數傳給對象。
class Point: def reset(self): self.x = 0 self.y = 0 p = Point() Point.reset(p) print(p.x, p.y) # 0 0
如何傳遞多個參數?假設在Point類中,添加新的方法,可以將點移動到任意位置,而不只是原點。另外可以接受另一個Point對象作為輸入,然后返回這兩個對象之間的距離。
import math class Point: def move(self, x, y): # 接受x和y兩個參數,並且給self對象賦值 self.x = x self.y = y def reset(self): # 移動到特定位置的move self.move(0, 0) # 接受另一個Point對象作為輸入,返回距離 def calculate_distance(self, other_point): return math.sqrt( (self.x - other_point.x) ** 2 + (self.y - other_point.y) ** 2) # 如何使用它 point1 = Point() point2 = Point() point1.reset() point2.move(5, 0) print(point2.calculate_distance(point1)) #5.0 #assert是一個簡單的測試工具,如果后面的語句是False(0,空或者None),這個程序會異常退出 assert(point2.calculate_distance(point1) == point1.calculate_distance(point2)) point1.move(3, 4) print(point1.calculate_distance(point2)) #4.472135955 print(point1.calculate_distance(point1)) #0.0
參考:
1、《Python3 面向對象編程》 [加]Dusty Philips 著