確定物件是物件導向分析和程式設計中最為重要的任務。
物件同時包含「資料」和「行為」。如果只對資料操作,使用列表、集合、字典或者python中的其他資料結構通常是更好的選擇;如果只關注行為而不儲存任何資料,那乙個簡單的函式則會更為合適。
把物件當做「物件」來對待,不能因為能夠使用乙個物件就急於使用這個物件,也絕不要在當你需要使用乙個類的時候,疏於建立乙個類。
下面列舉了乙個計算多邊形周長的例子來說明物件導向和面向函式的區別。
面向函式程式設計如下:
importmath
defdistance(p1, p2):
return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2)
defperimeter(polygon):
perimeter =0
points = polygon +[polygon[0]]
for i in
range(len(polygon)):
perimeter += distance(points[i], points[i+1])
return perimeter
具體呼叫如下所示:
>>> square = [(1,1), (1,2), (2,2), (2,1)](perimeter(square))
4.0
如果使用物件導向的程式設計,可以考慮封裝點的列表(資料)和perimeter函式(行為)。
importmath
class
point:
def__init__
(self, x, y):
self.x =x
self.y =ydef
distance(self, p2):
return math.sqrt((self.x - p2.x)**2 + (self.y - p2.y)**2)
class
polygon:
def__init__
(self):
self.vertices =
defadd_point(self, point):def
perimeter(self):
perimeter =0
points = self.vertices +[self.vertices[0]]
for i in
range(len(self.vertices)):
perimeter += points[i].distance(points[i+1])
return perimeter
呼叫如下:
>>> square =polygon()>>> square.add_point(point(1,1))
>>> square.add_point(point(1,2))
>>> square.add_point(point(2,2))
>>> square.add_point(point(2,1))
>>>square.perimeter()
4.0
相比而言,物件導向的**要易讀。
物件導向和面向函式的區別取決於怎樣設計,一般來說,越是複雜的資料集,越容易需要對這些資料進行特定操作的函式,這時使用具有屬性和方法的類也就越有價值。
另外需要額外注意的是,物件之間的互動,首先看繼承關係,繼承關係在沒有類的情況下不可能被簡單地模擬出來,所以一定要使用類來表現繼承關係。另外還有關聯和組合關係。
參考:1、《python3 物件導向程式設計》 [加]dusty philips 著
物件導向程式設計 使用 slots
學習廖雪峰老師的python教程中的使用 slots 的筆記 usr bin env python3 coding utf 8 class student object pass s student s.name michael 給例項繫結屬性 print s.name 給例項繫結方法 def se...
何時應該使用Mock物件?
英文原文 中文原文 在 ode to code 上,k scott allen理性地分析了如何在單元測試中使用mock物件,並分享了他針對mock物件框架使用情況的想法。首先,allen就人們對mock的常見誤解,丟擲了尖銳的意見 我們知道,像與smtp伺服器通訊的物件這樣的資源,是很難在單元測試中...
何時應該使用Mock物件?
英文原文 中文原文 在 ode to code 上,k scott allen理性地分析了如何在單元測試中使用mock物件,並分享了他針對mock物件框架使用情況的想法。首先,allen就人們對mock的常見誤解,丟擲了尖銳的意見 我們知道,像與smtp伺服器通訊的物件這樣的資源,是很難在單元測試中...