目录
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类(超类),新类称为子类。
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() # 调用电瓶方法
运行结果: