第八章 面向對象
使用面向對象的程序設計,能夠更好的設計軟件架構,維護軟件模塊,並易於框架和組件的重用。python
支持面向過程,面向對象,函數式編程等多種編程範式。python
不強制我們使用任何一種編程範式,我們可以使用過程式編程編寫任何程序。對於中等和大型項目來說,面向對象將給我們帶來很多優勢。(看到寫到這裏我就開始犯嘀咕,當我寫代碼超過500行的時候是什麼時候)
8.1 面向對象的概述
面向對象是一種描述業務問題,設計業務實體和實體之間關係的方法。面向對象主要用於軟件開發的分析和設計階段,通常使用UML
(統一建模語言)進行建模。
8.2 類和對象
python
使用class
關鍵字定義一個類,類名的首字符一般要大寫。類把需要使用的變量和方法組合到一起,這種方式稱爲封裝。類的方法必須有一個self
參數,但是在方法調用時可以不傳遞這個參數。
8.3 屬性和方法
類由屬性和方法組成。類的屬性是對數據的封裝,而類的方法則表示對象具有的行爲。類通常由函數和變量組成。python
的構造函數,析構函數,私有屬性或方法都是通過名稱約定區分的。
python
的屬性分爲實例屬性和靜態屬性。實例屬性是以self
爲前綴的屬性。__init__
方法即python
類的構造函數,如果__init__
方法中定義的變量沒有使用self
作爲前綴聲明,則該變量只是普通的局部變量。在python
中靜態變量被稱爲類變量,類變量可以在該類的所有實例中被共享。
class Fruit:
price = 0 # 類屬性
def __init__(self):
self.color = "red" # 實例變量
zone = "China" # 局部變量
if __name__ == "__main__":
print(Fruit.price) # 使用類名調用類變量
apple = Fruit() # 實例化
print(apple.color) # 打印apple實例的顏色
Fruit.price = Fruit.price + 10 # 將類變量加10
print ("apple's price:" + str(apple.price)) # 打印apple實例的price
banana = Fruit() # 實例化banana
print ("banana's price:" + str(banana.price)) # 打印banana實例的price
類的方法也分爲公有方法和私有方法。私有方法不能被模塊外的類或方法調用,私有方法也不能被外部的類或函數調用。python
的靜態方法並有沒和類的實例進行名稱綁定,要調用只需使用類名作爲它的前綴即可。
self
參數用於區分函數和類的方法。
python
中還有一種方法稱爲類方法。類方法是將類本身作爲操作對象的方法。
構造函數用於初始化類的內部狀態,爲類的屬性默認值。python
的構造函數名爲__init__
。__init__
方法除了用於定義實例變量外,還用於程序的初始化。
析構函數用於釋放釋放對象佔用的資源。python
提供了析構函數__del__()
。析構函數可以顯示釋放對象佔用的資源,是另一種資源釋放的方式。如果程序中不提供析構函數,python
會在後臺提供默認的析構函數,所以應該在只有需要的時候再定義__del__()
。
python
採用垃圾回收機制清除對象,python
提供了gc
模塊釋放不再使用的對象。垃圾回收機制有許多種算法,python
採用的是引用計數的方式。當某個對象在其作用域內引用計數爲0
時,python
就會自動清除該對象。垃圾回收機制很好的避免了內存泄漏的發生。
8.4 繼承
繼承是面向對象的重要特性之一。通過繼承可以創建新類,目的是使用或修改現有類的行爲。原始的類被稱爲父類或超類,新類被稱爲子類或派生類。繼承可以實現代碼的重用,減少代碼的編寫。
python
在類名後使用一對括號表示繼承的關係,括號中的類即爲父類。如果父類定義了__init__
方法,子類必須顯式調用父類的__init__
方法。
子類可以替代父類對象,這種特性稱爲多態性,由於python
的動態類型,決定了python
的多態性。
python
支持多重繼承,即1個類可以繼承多個父類。多重繼承的語法格式如下所示:
class_name(parent_class1, parent_class2...)
其中class_name
是類名,parent_class1
,和parent_class2
是父類名。