3、继承:
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类;子类同时还可以定义自己的属性和方法。
3.1、子类的方法__init__()
创建子类实例时,Python首先需要完成的任务是给父类的所有属性赋值;所以,子类的方法__init__()
from car import Car
class ElectricCar( Car):
""" 电 动 汽 车 的 独 特 之 处"""
❸ def __init__( self, make, model, year):
""" 初 始 化 父 类 的 属 性"""
❹ super().__init__( make, model, year)
❺ my_tesla = ElectricCar(' tesla', 'model s', 2016)
print( my_tesla.get_descriptive_name())
- 创建子类时,必须在括号内指定父类的名称。
class EletricCar(Car)
- 方法
__init__()
接受创建Car实例所需的信息。 super()
是一个特殊的函数,帮助Python将父类和子类联系起来。- 这行代码让Python调用ElectricCar的父类方法
__init__()
让ElectricCar实例包含父类的所有属性。 - 父类也称为超类(superclass),名称
super
因此得名。
- 这行代码让Python调用ElectricCar的父类方法
3.2、给子类定义属性和方法:
class Car():
--snip--
class ElectricCar( Car):
""" Represent aspects of a car, specific to electric vehicles."""
def __init__( self, make, model, year):
"""
电 动 汽 车 的 独 特 之 处 初 始 化 父 类 的 属 性,
再 初 始 化 电 动 汽 车 特 有 的 属 性
"""
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)
print( my_tesla.get_descriptive_name())
my_tesla.describe_battery()
- 在①处我们添加了新属性
self.battery_size
,并设置其初始值(如70)- 根据ElectricCar类创建的所有实例都包含这个属性
- 但所有Car实例都不包含这一属性。
- 在②处,我们还添加了一个名字为
describe_battery()
的方法,它打印有关电瓶的信息。
3.3、重写父类的方法:
假设Car类有一个名为fill_gas_tank()
的方法,但它对全电动车来说毫无意义,因此你可以重写它:
class ElectricCar( Car):
--snip--
def fill_gas_tank():
""" 电 动 汽 车 没 有 油 箱"""
print(" This car doesn't need a gas tank!")
#对电动车调用方法fill_gas_tank(),Python将忽略Car类中的方法fill_gas_tank(),转而运行上诉代码。
使用继承时,可让子类保留从弗雷哪里继承而来的精华,并剔除不需要的糟粕。
3.4、将实例用作属性
class Car():
--snip--
❶ 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(ElectricCar, self).__init__(make,model,year)
❹ self.battery = Battery()
my_tesla = ElectricCar(' tesla', 'model s', 2016)
print( my_tesla.get_descriptive_name()) my_tesla.battery.describe_battery()
在上例ElectricCar类中,我们添加了一个名为**self.battery
的属性**(上例④)
- 这行代码让Python创建一个新的Battery实例,并将该实例存储在属性self.battery中。
- 每当方法
__init__()
被调用时,都将执行该操作;现在每个ElectricCar实例都包含一个自动创建的Battery实例。
3.5、模拟实物
现实世界的建模方法没有对错之分,但要找到效率最高的表示方法。
本章代码示例来自:[美] Eric Matthes. Python编程:从入门到实践