【Python】學習筆記之類|第8篇

書籍:《Python編程:從入門到實踐》
打卡人:Owenli
打卡時間:2018.4.17

Python從入門到實踐目錄

前言

面向對象編程 是最有效的軟件編寫方法之一。在面向對象編程中,你編寫表示現實世界中的事物和情景的類,并基于這些類來創建對象。編寫類時,你定義一大類對 象都有的通用行為。基于類創建對象 時,每個對象都自動具備這種通用行為,然后可根據需要賦予每個對象獨特的個性。使用面向對象編程可模擬現實情景,其逼真 程度達到了令你驚訝的地步。
根據類來創建對象被稱為實例化 ,這讓你能夠使用類的實例。在本章中,你將編寫一些類并創建其實例。你將指定可在實例中存儲什么信息,定義可對這些實例執行 哪些操作。你還將編寫一些類來擴展既有類的功能,讓相似的類能夠高效地共享代碼。你將把自己編寫的類存儲在模塊中,并在自己的程序文件中導入其他程序員編 寫的類。

一、創建和編寫類

Dog類為例,創建一個包含名字和年齡,具有蹲下和打滾能力的類。

Dog

類中的函數稱為方法,前面學習有關函數的內容在這里都適用。感到困惑的方法,應該就是 __init__()方法。它是一個特殊方法,每當創建實例時都會自動運行它。

我們將方法__init__() 定義成了包含三個形參:selfnameage 。在這個方法的定義中,形參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。

image.png

添加了一個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中類的概念,如何創建類、屬性、方法以及類繼承等相關知識。由于篇幅問題,下篇繼續學習類剩下的內容。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容