9.4、继承
编写类时,并非总是要从空白开始。如果要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,将自动获得另一个类的所有属性和方法。原有的类称为父类,而新类称为子类。子类继承了父类的所有属性和方法同时还可以定义自己的属性和方法。
(1)、子类的方法__init__(),在既有类的基础上编写新类时,通常要调用父类的方法__init__()。这将初始化在父类__init__()方法中定义的所有属性,从而让子类包含这些属性。例如,下面来模拟电动汽车。电动汽车是一种特殊的汽车,因此可在前面创建的Car类的基础上创建新类 ElectricCar。这样就只需为电动汽车特有的属性和行为编写代码。
输出:
(代码解析:创建子类时,父类必须包含在当前文件中,且位于子类前面,定义了子类 ElectricCar定义子类时,必须在圆括号内指定父类的名称方法__init__()接受创建Car实例所需的信息。
super()是一个特殊函数,让你能够调用父类的方法。这行代码让 Python调用car类的方法__init__(),让 ElectricCar实例包含这个方法中定义的所有属性。父类也称为超类( superclass),名称 super由此而来。
为测试继承能够正确地发挥作用,我们尝试创建一辆电动汽车,但提供的信息与创建普通汽车时相同。创建 ElectricCar类的一个实例,将其赋给变量my_tesla这行代码调用 Electriccar类中定义的方法_init_(),后者让 Python调用父类Car中定义的方法__init__()我们提供了实参’tesla’、‘model s’'和2019)
(2)、给子例定义属性和方法
下面来添加一个电动车固有的属性,以及一个描述该属性的方法:
输出:
(3)、将实例用作属性
下面给battery类增加一个方法,它根据电瓶容量报告汽车的续航里程。
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 = f"{self.year} {self.make} {self.model}"
return long_name.title()
def read_odometer(self):
"""打印一条指出汽车里程的信息"""
print(f"This car has {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 = 75):
"""初始化电瓶的属性"""
self.battery_size = battery_size
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print(f"This car has a {self.battery_size}-kwh battery.")
def get_range(self):
"""打印一条消息,指出电瓶的续航里程"""
if self.battery_size == 75:
range = 260
elif self.battery_size == 100:
range = 315
print(f"This car can go about {range} miles on a full charge.")
class ElectricCar(Car):
"""电动汽车的独特之处"""
def __init__(self,make,model,year):
"""
初始化父类属性
再初始化电动汽车的特有属性
"""
super().__init__(make,model,year)
self.battery = Battery()
def describe_battery(self):
"""打印一条描述电瓶容量的消息"""
print(f"This car has a {self.battery_size}-kwh battery.")
my_tesla = ElectricCar('tesla','model s',2019)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()
输出:
9.5、Python标准库
Python标准库是一组模块,我们安装的 Python都包含它。你现在对函数和类的工作原理已有大致的了解,可以开始使用其他程序员编写好的模块了。可以使用标准库中的任何函数和类,只需在程序开头包含一条简单的 import语句即可。下面来看看模块 random,它在你模拟很多现实情况时很有用。在这个模块中,一个有趣的函数是 randint()它将两个整数作为参数,并随机返回一个位于这两个整数之间(含)的整数。下面演示了如何生成一个位于1和6之间的随机整数:
在模块 random中,另一个有用的函数是 choice()。它将一个列表或元组作为参数,并随机返回其中的一个元素:
总结:在本章中,笔者演示了如何编写类;如何使用属性在类中存储信息,以及如何编写方法,以让类具备所需的行为;如何编写方法init_(),以便根据类创建包含所需属性的实例。你见识了如何修改实例的属性,包括直接修改以及通过方法进行修改。你还了解了使用继承可简化相关类的创建工作,以及将一个类的实例用作另一个类的属性可让类更简洁。在此Python程序设计基础部分的内容到此要告一个段落了,下一部分的学习将会利用python进行简单的神经网络编程,以及数据的可视化。