第九章:类


2018年10月25日

9.1 创建类

下面编写一个表示汽车的类,它存储了有光汽车的信息,还有一个汇总这些信息的方法:

# car.py
class Car():
    """一次模拟汽车的简单尝试"""
    
    def __init__(self, make, model, year, gas_tank_capacity=60):    # 属性初始化默认值
        """初始化描述汽车的属性"""
        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    # 给属性指定默认值

    def get_descriptive_name(self):    # 方法调用属性的值
        """返回整洁的描述性信息"""
        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):    # 通过方法修改属性的值
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage

9.2 继承

编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

9.2.1 子类的方法__init__()

创建子类的实例时,Python首先需要完成的任务是给父类的所有属性赋值。为此子类的方法__init__()需要父类施以援手。
下面来模拟电动汽车,在前面创建的Car类的基础上类创建新类ElectricCar。

# electric_car.py
from car import Car    # 从模块中导入类

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):
    """电动汽车的独特之处"""
    
    def __init__(self, make, model, year):
        """初始化父类的属性,再初始化电动汽车特有的属性"""
        super().__init__(make, model, year)

        self.battery_size = Battery()    # 将Battery类的实例用作属性

    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--

函数super()需要两个实参:子类名和对象self。另外在Python 2.7中实现继承时,务必在定义父类时在括号内指定object

9.3 使用类

创建实例后,就可以通过句点表示法访问实例的属性和方法。下面是根据类创建实例后的测试

>>> 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属性,因为在子类调用super().__init__()时仍然调用了父类的__init()__方法。

你可能感兴趣的:(第九章:类)