Python编程从入门到实践第九章练习四
练习9-9
# 电瓶升级:在本节最后一个electric_car.py中,给Battery类添加一个名为upgrade_battery()的方法。该方法检查电瓶容量,如果不是100就将其设置为100。创建一辆电瓶容量为默认值的电动汽车,调用方法get_range(),然后对电瓶进行升级,并再次调用get_range().你将看到这辆汽车的续航里程增加了。
1 class Car:
2 """一次模拟汽车的简单尝试"""
3
4 def __init__(self,make,model,year): # 创建三个形参,分别对应汽车的制造商、型号以及生产年份
5 """初始化描述汽车的属性"""
6 self.make = make
7 self.model = model
8 self.year = year
9 self.odometer_reading = 0 # 添加一个属性,直接在初始化定义中添加即可,不用改变形参
10
11 def get_descriptive_name(self): # 返回汽车的概要信息
12 """返回整洁的描述信息"""
13 long_name = f"{self.year} {self.make} {self.model}"
14 return long_name.title()
15
16 def read_odometer(self): # 打印汽车的里程信息
17 """打印一条支出汽车里程的消息"""
18 print(f"This car has {self.odometer_reading} miles on it.")
19
20 def update_odometer(self,mileage): # 定义一个方法,将形参指定的实参,赋值给属性odometer_reading
21 # """将里程表读数设置为指定的值"""
22 # self.odometer_reading = mileage
23 """扩展:将里程表读数设置为指定的值,禁止将里程表读书往回调"""
24 if mileage > self.odometer_reading: # 如果里程的设置值大于当前属性的值odometer_reading,则将设置值赋值给属性
25 self.odometer_reading = mileage
26 else: # 否则,打印消息
27 print("You cam't roll back an odometer!")
28
29 def increment_odometer(self,miles): # 定义一个方法,将形参miles对应的实参,赋值给属性odometer_reading
30 """将里程表读数增加指定的量"""
31 self.odometer_reading += miles
32
33 class Battery: # 定义一个新类,无继承任何类
34 """模拟电动汽车电瓶"""
35
36 def __init__(self,battery_size=75): # 定义了一个属性battery_size,默认值为75
37 """初始化电瓶的属性"""
38 self.battery_size = battery_size # 将新增的属性赋值给self.battery_size
39
40 def describe_battery(self): # 调用self.battery_size
41 """描述电瓶容量"""
42 print(f"The car has a {self.battery_size}-kwh battery.")
43
44 def get_range(self):
45 """描述电瓶的续航里程"""
46 if self.battery_size == 75:
47 range = 260 # 由于range不是该类的属性,所以在前面不需要添加self
48 elif self.battery_size == 100:
49 range = 315
50
51 print(f"This car can go about {range} miles on a full charge.")
52
53 def upgrade_battery(self):
54 """升级电瓶容量"""
55 if self.battery_size == 100:
56 self.battery_size = self.battery_size
57 else:
58 self.battery_size = 100
59
60 class ElectricCar(Car): # 创建子类时,必须将父类包含在当前文件中,且必须位于子类前面
61 """"电动汽车的特殊之处"""
62
63 def __init__(self,make,model,year): # 接受创建实例所需的信息,相当于复制父类的所有属性
64 """初始化父类的属性,再初始化电动汽车特有的属性"""
65 super().__init__(make,model,year) # super()函数功能:能够调用父类的方法,所以父类也称作超类
66 self.battery = Battery() # 在ElectricCar这个类中添加了一个名为self.battery的属性,指向的是一个Battery实例
67 # 每次调用该方法时,都会执行该操作,因此每个ElectricCai实例都包含一个自动创建的Battery实例
68
69 my_tesla = ElectricCar('tesla','model s',2019) # 创建一个名为my_tesla属于ElectricCar类的实例,并将对应实参指定给形参
70 print(my_tesla.get_descriptive_name())
71
72 my_tesla.battery.describe_battery()
73 # 注:上一步骤是让python在实例my_tesla中查找属性battery,并对存储在该属性中的Battery实例调用方法describe_battery()
74 my_tesla.battery.get_range()
75
76 my_tesla.battery.upgrade_battery() # 对电瓶容量进行升级
77 my_tesla.battery.get_range()

浙公网安备 33010602011771号