書籍:《Python編程:從入門到實踐》
打卡人:Owenli
打卡時間:2018.4.17
Python從入門到實踐目錄
- Python學習筆記之基本數據類型|第1篇
- Python學習筆記之列表|第2篇
- Python學習筆記之條件控制|第3篇
- Python學習筆記之字典|第4篇
- Python學習筆記之用戶輸入和While循環|第5篇
- Python學習筆記之函數|第6篇
- Python學習筆記之函數(續)|第7篇
- Python學習筆記之類|第8篇
- Python學習筆記之類(續)|第9篇
- Python學習筆記之文件和異常(上)|第10篇
- Python學習筆記之文件和異常(下)|第11篇
前言
面向對象編程 是最有效的軟件編寫方法之一。在面向對象編程中,你編寫表示現實世界中的事物和情景的類,并基于這些類來創建對象。編寫類時,你定義一大類對 象都有的通用行為。基于類創建對象 時,每個對象都自動具備這種通用行為,然后可根據需要賦予每個對象獨特的個性。使用面向對象編程可模擬現實情景,其逼真 程度達到了令你驚訝的地步。
根據類來創建對象被稱為實例化 ,這讓你能夠使用類的實例。在本章中,你將編寫一些類并創建其實例。你將指定可在實例中存儲什么信息,定義可對這些實例執行 哪些操作。你還將編寫一些類來擴展既有類的功能,讓相似的類能夠高效地共享代碼。你將把自己編寫的類存儲在模塊中,并在自己的程序文件中導入其他程序員編 寫的類。
一、創建和編寫類
以Dog
類為例,創建一個包含名字和年齡,具有蹲下和打滾能力的類。
類中的函數稱為方法,前面學習有關函數的內容在這里都適用。感到困惑的方法,應該就是 __init__()
方法。它是一個特殊方法,每當創建實例時都會自動運行它。
我們將方法__init__()
定義成了包含三個形參:self
、name
和age
。在這個方法的定義中,形參self
必不可少,還必須位于其他形參的前面。為何必須在方法定義中包 含形參self
呢? 因為Python調用這個__init__()
方法來創建Dog
實例時,將自動傳入實參self
。每個與類相關聯的方法調用都自動傳遞實參self
,它是一個指向實例本身 的引用,讓實例能夠訪問類中的屬性和方法。我們創建Dog 實例時,Python
將調用Dog
類的方法__init__()
。我們將通過實參向Dog()
傳遞名字和年齡;self
會自動傳遞,
因此我們不需要傳遞它。每當我們根據Dog
類創建實例時,都只需給最后兩個形參(name 和age )提供值。
1.1 根據類創建實例
上面定義了Dog
類,下面看看如何創建Dog
實例。
創建實例my_dog
。在打印實例信息時,通過使用.
語法來訪問屬性名。
訪問方法,也是通過.
語法。
my_dog.sit()
my_dog.roll_over()
類創建實例的個數是不受限制的,可按需求根據類創建任意數量的實例。每個實例之間會不影響,存在不同的內存地址中。
二、使用類和實例
修改類屬性的方法,可以直接修改實例屬性,也可以編寫方法以特定的方式進行修改。
下面定義一個Car
類。
2.1 給屬性指定默認值
類中的每個屬性都必須有初始值,哪怕這個值是0或空字符串。設置初始值,可以在__init__()
內指定這種初始值,這樣就不用設置形參了。
還是上面的Car
類,添加一個odometer_reading
屬性,并設置默認值為0。
添加了一個read_odometer()
方法用來打印里程信息。
2.2. 修改屬性值
汽車里程是隨著使用,逐漸遞增的。如何修改屬性值呢?
- 直接修改屬性值
my_new_car.odometer_reading = 23
my_new_car.read_odometer()
# 輸出結果: This is has 23 miles on it.
- 通過方法修改屬性值
class Car():
# ....
def update_odometer(self, mileage):
"""將里程數設為指定值,遞增"""
self.odometer_reading += mileage
my_new_car.update_odometer(34)
my_new_car.read_odometer()
# 輸出結果: This is has 34 miles on it.
通過使用update_odometer()
方法來更新屬性的值。
三、繼承
編寫類時,并非總是要從空白開始。如果你要編寫的類是另一個現成類的特殊版本,可使用繼承 。一個類繼承 另一個類時,它將自動獲得另一個類的所有屬性和方法;原有的 類稱為父類 ,而新類稱為子類 。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法。
3.1 子類的方法__init__()
創建子類的實例時,Python
首先需要完成的任務是給父類的所有屬性賦值。因此, 需要在初始化方法調用父類的初始化方法。
在上面我們定義了Car
類,通過繼承定義一個ElectricCar
電動車類。
上面定義了ElectricCar
類繼承自Car
。子類擁有父類所有的屬性和方法。
在子類的初始化方法中super()
是一個特殊函數,幫助Python
將父類和子類關聯起來。
3.2 給子類定義屬性和方法
讓一個類繼承另一個類后,可添加區分子類和父類所需的新屬性和方法。
根據ElectricCar
創建的實例都會有這個屬性,而Car
的實例沒有。
3.3 重寫父類方法
對于父類的方法,只要它不符合子類模擬的實際行為,都可對其進行重寫。
def get_descriptive_name(self):
"""打印名稱"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model + ' ' + self.battery_size
return long_name.title()
重寫父類get_descriptive_name()
多打印battery_size
信息。
3.4 實例做屬性
使用代碼模擬實物,隨著細節的增加需要代碼越來越多。這種情況下可以將類中一部分提取出來,組合成多各類協作的方式。
添加Battery
類,負責電池管理。它的實例是ElectricCar
類的一個屬性。
四、小結
本篇學習Python
中類的概念,如何創建類、屬性、方法以及類繼承等相關知識。由于篇幅問題,下篇繼續學習類剩下的內容。