文章目錄
第八章 類
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!")
- 方法
__init__()
- 類中的函數稱爲方法 ;你前面學到的有關函數的一切都適用於方法。
- 方法__init__()是一個特殊的方法,每當你根據Dog類創建新實例時,Python都會自動運行它。
- 在這個方法的名稱裏,開頭和末尾都有兩個下劃線,這是一種約定,爲了避免與普通方法名稱衝突
- 該方法裏有三個形參:self、 name和age。其中self是必不可少的,還必須放在所有參數前面。因爲每個與類相關聯的方法都調用都自動傳遞self,它是一個指向實例本身的引用,讓實例能夠訪問類中的屬性和方法。我們創建Dog實例時,Python將調用__init__()方法。我們通過實參向Dog()傳遞名字和年齡,而self會自動傳遞。所以每次我們只需要給最後兩個形參(age和name)即可。
- 在方法__init__()的定義中,兩個變量都有前綴self。以self爲前綴的變量都可供類中的所有方法使用,可以通過類的任何實例訪問這些量。
self.name=name獲取存儲在形參name中的值,並存儲到變量name中,然後該變量被關聯到創建的實例。
像這樣可以通過實例訪問的變量稱爲屬性。
- 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
輸出的順序與添加的順序完全相同。