2018年10月25日
9.1 創(chuàng)建類
下面編寫一個表示汽車的類油昂,它存儲了有光汽車的信息,還有一個匯總這些信息的方法:
# car.py
class Car():
"""一次模擬汽車的簡單嘗試"""
def __init__(self, make, model, year, gas_tank_capacity=60): # 屬性初始化默認(rèn)值
"""初始化描述汽車的屬性"""
self.make = make
self.model = model
self.year = year
self.__gas_tank_capacity = gas_tank_capacity
self.gas_tank_indicator = 0
self.odometer_reading = 0 # 給屬性指定默認(rèn)值
def get_descriptive_name(self): # 方法調(diào)用屬性的值
"""返回整潔的描述性信息"""
long_name = ' '.join([str(self.year), self.make, self.model])
return long_name.title()
def fill_gas_tank(self):
"""加滿油箱"""
self.gas_tank_indicator = self.__gas_tank_capacity
def update_odometer(self, mileage): # 通過方法修改屬性的值
"""將里程表讀數(shù)設(shè)置為指定的值"""
self.odometer_reading = mileage
9.2 繼承
編寫類時童社,并非總是要從空白開始溯警。如果要編寫的類是另一個現(xiàn)成類的特殊版本,可使用繼承年柠。一個類繼承另一個類時凿歼,它將自動獲得另一個類的所有屬性和方法;原有的類稱為父類冗恨,而新類稱為子類答憔。子類繼承了其父類的所有屬性和方法,同時還可以定義自己的屬性和方法掀抹。
9.2.1 子類的方法__init__()
創(chuàng)建子類的實(shí)例時虐拓,Python首先需要完成的任務(wù)是給父類的所有屬性賦值。為此子類的方法__init__()
需要父類施以援手傲武。
下面來模擬電動汽車蓉驹,在前面創(chuàng)建的Car類的基礎(chǔ)上類創(chuàng)建新類ElectricCar。
# electric_car.py
from car import Car # 從模塊中導(dǎo)入類
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):
"""電動汽車的獨(dú)特之處"""
def __init__(self, make, model, year):
"""初始化父類的屬性揪利,再初始化電動汽車特有的屬性"""
super().__init__(make, model, year)
self.battery_size = Battery() # 將Battery類的實(shí)例用作屬性
def fill_gas_tank(self): # 重寫父類的方法
"""電動汽車沒有郵箱"""
print("This car doesn't need a gas tank!")
9.2.2 Python 2.7 中的繼承
在Python2.7中态兴,繼承語法稍有不同,ElectricCar類的定義類似下面這樣:
class Car(object):
--snip--
class ElectricCar(Car):
def __init__(self, make, model, year):
super(ElectricCar, self).__init__(make, model, year)
--snip--
函數(shù)super()
需要兩個實(shí)參:子類名和對象self
疟位。另外在Python 2.7中實(shí)現(xiàn)繼承時瞻润,務(wù)必在定義父類時在括號內(nèi)指定object
。
9.3 使用類
創(chuàng)建實(shí)例后,就可以通過句點(diǎn)表示法訪問實(shí)例的屬性和方法绍撞。下面是根據(jù)類創(chuàng)建實(shí)例后的測試
>>> from electric_car import ElectricCar
>>> my_car = ElectricCar('Telsa', 'Model S', 2016)
>>> my_car.get_descriptive_name()
'2016 Telsa Model S'
>>> my_car.gas_tank_indicator
0
>>> my_car.fill_gas_tank()
This car do not need a gas tank!
>>> my_car.odometer_reading
0
>>> my_car.update_odometer(10)
>>> my_car.odometer_reading
10
>>> my_car.battery_size.describe_battery()
This car has a 70-kWh battery
可以看到子類ElectricCar仍然繼承了Car類的gas_tank_indicator
屬性正勒,因?yàn)樵谧宇愓{(diào)用super().__init__()
時仍然調(diào)用了父類的__init()__
方法。