Python學習筆記(八):類

第八章 類


8.1 創建和使用類


8.1.1 創建類

class Dog():
    """模擬小狗的類"""
    def __init__(self, name, age):
        """ 初始化類信息"""
        self.name = name
        self.age = age
    
    def sit(self):
        print(self.name.title() + " sit down!")
    
    def roll(self):
        print(self.name.title() + " roll over!")
  1. 方法__init__()
  • 類中的函數稱爲方法 ;你前面學到的有關函數的一切都適用於方法。
  • 方法__init__()是一個特殊的方法,每當你根據Dog類創建新實例時,Python都會自動運行它。
  • 在這個方法的名稱裏,開頭和末尾都有兩個下劃線,這是一種約定,爲了避免與普通方法名稱衝突
  • 該方法裏有三個形參:self、 name和age。其中self是必不可少的,還必須放在所有參數前面。因爲每個與類相關聯的方法都調用都自動傳遞self,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。我們創建Dog實例時,Python將調用__init__()方法。我們通過實參向Dog()傳遞名字和年齡,而self會自動傳遞。所以每次我們只需要給最後兩個形參(age和name)即可。
  • 在方法__init__()的定義中,兩個變量都有前綴self。以self爲前綴的變量都可供類中的所有方法使用,可以通過類的任何實例訪問這些量。
    self.name=name獲取存儲在形參name中的值,並存儲到變量name中,然後該變量被關聯到創建的實例。
    像這樣可以通過實例訪問的變量稱爲屬性
  1. Dog類還定義了另外兩個方法:sit()和roll()。由於這些方法不需要額外的信息,因此他們只有一個形參self。

8.1.2 根據類創建實例

可將類視爲有關如何創建實例的說明。

class Dog():
   ...

my_dog = Dog('Tim', 2)
print("My dog's name is " + my_dog.name)
print("My dog's age is " + str(my_dog.age))
my_dog.sit()
my_dog.roll()

My dog’s name is Tim
My dog’s age is 2
Tim sit down!
Tim roll over!


8.2 繼承

一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法


8.2.1 子類的方法 __init__()

創建子類的實例時,Pyhton首先需要完成的是給父類的所有屬性賦值。爲此,子類的init方法需要父類“施以援手”。
例如,下面來模擬電動汽車,其爲繼承自“車”的子類。

class Car():

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_name(self):
        long_name = self.make + ' ' + self.model + ' ' + str(self.year)
        return long_name.title()


class ElectricCar(Car):

    def __init__(self, make, model, year):
        super().__init__(make, model, year)


my_tesla = ElectricCar('tesla', 'model', 2016)
print(my_tesla.get_name())

Tesla Model 2016

  • 定義子類時,必須在括號內指定父類的名稱
  • super()是一個特殊的函數,幫助Python將父類和子類關聯。這行代碼讓Python調用ElectricCar的父類的方法__init__(),讓ElectricCar實例包含父類的所有屬性。父類又稱超類(super class),super函數也是因此得名。

8.2.2 給子類定義屬性和方法

讓一個類繼承另一個類之後,可以擁有自己獨特的屬性。
比如電動汽車有一項指標是電池容量

class Car():

    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    ...


class ElectricCar(Car):

    def __init__(self, make, model, year, batterysize):
        super().__init__(make, model, year)
        self.batterysize = batterysize
    def get_bat_size(self):
        return self.batterysize

my_tesla = ElectricCar('tesla', 'model', 2016, 70)
print(my_tesla.get_bat_size())

70

8.2.3 重寫父類的方法

對於父類的方法,只要不符合子類的"規則",都可以進行重寫。即在子類中定義一個重名的方法,這樣Python將不會考慮父類中的這個方法。
比如描述電動汽車的名字還需要帶上電池容量,則需要重寫get_name函數

class Car():

    ...

    def get_name(self):
        long_name = self.make + ' ' + self.model + ' ' + str(self.year)
        return long_name.title()


class ElectricCar(Car):

    ...
    def get_name(self):
        long_name = self.make + ' ' + self.model + ' ' + str(self.year) + ' ' + str(self.batterysize)
        return long_name.title()


my_tesla = ElectricCar('tesla', 'model', 2016, 70)
print(my_tesla.get_name())

Tesla Model 2016 70

8.2.3 將類作爲其他類的屬性

和C++類的嵌套相似,不多贅述


8.3 導入類

語法 作用
from 模塊名 import 類名 導入單個類
from 模塊名 import 類1,類2… 導入多個類
import 模塊名 導入整個模塊的類(使用需要加句點)
from 模塊名 import * 導入模塊所有類 (使用不需要加句點)

8.3.1 在一個模塊中導入另一個模塊

模塊可以連環導入,比如

8.4 Python標準庫

Python標準庫是Python內置的一組模塊。只需在程序開頭包含一條簡單的import語句,便可使用標準庫的函數和類。比如模塊collections中的一個類——OrderedDict.
字典雖然能夠把信息關聯,但不能記錄你添加鍵值對的順序。而OrderedDict可以解決這個問題。

from collections import OrderedDict

fav_lang = OrderedDict()

fav_lang['Lily'] = 'C'
fav_lang['Tom'] = 'Python'
fav_lang['Jack'] = 'JAVA'

for name, lang in fav_lang.items():
    print(name + " " + lang)

Lily C
Tom Python
Jack JAVA

輸出的順序與添加的順序完全相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章