《Python程式設計從入門到實踐》記錄之類繼承
阿新 • • 發佈:2018-11-28
目錄
一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法;原有的類稱為父類(超類),新類稱為子類。
1、子類定義和建立
下邊結合例子詳細敘述類的繼承,下邊例子是一個簡單的ElectricCar類,它具備了Car類的所有功能:
#!/usr/bin/env python # -*- coding:utf-8 -*- # 父類 class Car(): """一次模擬汽車的簡單嘗試""" def __init__(self, make, model, year): """初始化描述汽車的屬性""" self.make = make self.model = model self.year = year self.odometer_reading = 0 # 指定預設值 def get_descriptive_name(self): """返回整潔的描述性資訊""" long_name = str(self.year) + ' ' + self.make + ' ' + self.model return long_name.title() def read_odometer(self): """列印一條指出汽車裡程的訊息""" print("This car has " + str(self.odometer_reading) + " miles on it.") def update_odometer(self, mileage): """將歷程表讀數設定為指定的值""" if mileage >= self.odometer_reading: self.odometer_reading = mileage else: print("You can't roll back an odometer") def increment_odometer(self, miles): """將里程錶讀數增加指定的量""" self.odometer_reading += miles # 子類,括號裡必須包含父類名稱 class ElectricCar(Car): """電動汽車的獨特之處""" # 接受建立Car例項所需的資訊 def __init__(self, make, model, year): """初始化父類的屬性""" # super()特殊的函式,關聯父類和子類 super().__init__(make, model, year) # 初始化父類的屬性 self.battery_size = 70 # 初始化電動車特有的屬性 def describe_battery(self): """列印一條描述電瓶容量的資訊""" print("This car has a " + str(self.battery_size) + "-kwh battery.") my_tesla = ElectricCar('tesla', 'model S', 2016) # 建立一個my_tesla例項 print(my_tesla.get_descriptive_name()) # 列印車輛資訊 my_tesla.describe_battery() # 呼叫電瓶方法
執行結果為:
由上邊程式碼為例子來詳細敘述建立子類的方法:
- 建立子類時,必須包含父類且必須位於子類前面
- 定義子類時,括號裡必須包含父類的名稱
- 在_init_方法內,必須初始化父類所需要的資訊,使用super().__init__()方法初始化父類屬性
- 子類特有的屬性只包含在子類的例項中,父類的例項並不包含。
2、重寫父類的方法
可以對父類中的方法進行重寫,方法是在子類中定義與父類同樣名字的方法,這樣,Python將不會考慮這個父類方法,而只關注子類中定義的相應方法。
假設上述例子中Car類有一個名為fill_gas_tank()的方法,對於電動汽車來說毫無意義,因此可以重寫它,程式碼類似如下:
class ElectricCar(Car):
--snip--
def fill_gas_tank(self):
"""電動汽車沒有郵箱"""
print("This car doesn't need a gas tank!")
3、將例項用作屬性
將一個類的例項用作一個類的屬性。如還是上述例子,電動汽車有很多關於電瓶的屬性和方法,為了使得程式更直觀整潔,將關於電瓶的屬性和方法放到一個名為Battery的類中,並將一個Battery例項用作ElectricCar類的一個屬性,程式碼類似如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# 父類
class Car():
"""一次模擬汽車的簡單嘗試"""
def __init__(self, make, model, year):
"""初始化描述汽車的屬性"""
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0 # 指定預設值
def get_descriptive_name(self):
"""返回整潔的描述性資訊"""
long_name = str(self.year) + ' ' + self.make + ' ' + self.model
return long_name.title()
def read_odometer(self):
"""列印一條指出汽車裡程的訊息"""
print("This car has " + str(self.odometer_reading) + " miles on it.")
def update_odometer(self, mileage):
"""將歷程表讀數設定為指定的值"""
if mileage >= self.odometer_reading:
self.odometer_reading = mileage
else:
print("You can't roll back an odometer")
def increment_odometer(self, miles):
"""將里程錶讀數增加指定的量"""
self.odometer_reading += miles
class Battery():
"""一次模擬電動汽車電瓶的簡單嘗試"""
def __init__(self, battery_size=70):
"""初始化電瓶的屬性"""
self.battery_size = battery_size
def describe_battery(self):
"""列印一條描述電瓶容量的資訊"""
print("This car has a " + str(self.battery_size) + "-kwh battery.")
# 子類,括號裡必須包含父類名稱
class ElectricCar(Car):
"""電動汽車的獨特之處"""
# 接受建立Car例項所需的資訊
def __init__(self, make, model, year):
"""初始化父類的屬性"""
# super()特殊的函式,關聯父類和子類
super().__init__(make, model, year) # 初始化父類的屬性
# Battery的一個例項作為ElectricCar的一個屬性
self.battery = Battery(100)
my_tesla = ElectricCar('tesla', 'model S', 2016) # 建立一個my_tesla例項
print(my_tesla.get_descriptive_name()) # 列印車輛資訊
my_tesla.battery.describe_battery() # 呼叫電瓶方法
執行結果: