问题遇到的现象和发生背景
我在学习《Python编程从入门到实践》这本书,在9.4.2节 ‘在一个模块中存储多个类’中遇到了如下问题:
9.4.2 在一个模块中存储多个类
虽然同一个模块中的类之间应存在某种关联性,但可根据需要在一个模块中存储任意数量的类。类Bettery和ElectricCar都可帮助模拟汽车,因此下面将他们都加入模块car.py中:
问题相关代码,请勿粘贴截图
car.py
"""一组可用于表示燃油汽车和电动汽车的类"""
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) + " mile 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, mileage):
"""将里程表读书增加指定的量"""
self.odometer_reading += miles
class Bettery():
"""一次模拟电动汽车电瓶的简单尝试"""
def __init__(self, bettery_size=60):
"""初始化电瓶的属性"""
self.bettery_size = bettery_size
def describe_bettery(self):
"""打印一条描述电瓶容量的消息"""
print("This car has a " + str(self.bettery_size) + "kWh bettery.")
def get_range(self):
"""打印一条描述电瓶续航的消息"""
if self.bettery_size == 70:
range = 240
elif self.bettery_size == 85:
range = 270
message = "This car can go appeoximately " + str(range)
message += " miles on a full charge."
print(message)
class ElectricCar(Car):
"""Represent aspects of a car, special to electric vehicles"""
def __init__(self, make, model, year):
"""
电动汽车的独特之处
初始化父类的属性,再初始化电动汽车特有的属性
"""
super().__init__(make, model, year)
self.bettery = Bettery()
现在,可以创建一个名为my_electric_car.py的文件,导入ElectricCar类,并创建一辆电动汽车了:
my_electric_car.py
from car import ElectricCar
my_tesla = ElectricCar('tesla', 'mosel s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.bettery.describe_bettery()
my_tesla.bettery.get_range()
运行结果及报错内容
运行结果如下:
我的解答思路和尝试过的方法
我意识到问题出在局部变量被提前定义了,因此通过上网查阅文献,试图在代码相应位置插入global range, 但是问题仍然没能解决。
我想要达到的结果
我想要能够像书上表达的一样输出完整结果,书上表示结果应该如下:
2016 Tesla Model S
This car has a 70-kWh bettery.
This car go approximately 240 miles on a full charge.