1. 程式人生 > >《Python程式設計從入門到實踐》記錄之類繼承

《Python程式設計從入門到實踐》記錄之類繼承

目錄

1、子類定義和建立

2、重寫父類的方法 

3、將例項用作屬性


一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法;原有的類稱為父類(超類),新類稱為子類

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()  # 呼叫電瓶方法

執行結果: