m0_66452591 2022-02-15 11:15 采纳率: 100%
浏览 36
已结题

我在学习《Python编程从入门到实践》这本书,在9.4.2节 ‘在一个模块中存储多个类’中遇到了如下问题

问题遇到的现象和发生背景

我在学习《Python编程从入门到实践》这本书,在9.4.2节 ‘在一个模块中存储多个类’中遇到了如下问题:

img

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()

运行结果及报错内容

运行结果如下:

img

我的解答思路和尝试过的方法

我意识到问题出在局部变量被提前定义了,因此通过上网查阅文献,试图在代码相应位置插入global range, 但是问题仍然没能解决。

我想要达到的结果

我想要能够像书上表达的一样输出完整结果,书上表示结果应该如下:
2016 Tesla Model S
This car has a 70-kWh bettery.
This car go approximately 240 miles on a full charge.

  • 写回答

3条回答 默认 最新

  • 谛凌 2022-02-15 11:20
    关注

    题主,你的range是在if elif里面定义的,当self.bettery_size取默认值60时是无法定义的,后面是无法使用的,可以在if之前先定义为默认值的取值,再在if里面修改它的值
    修改一下:

    def get_range(self):
            """打印一条描述电瓶续航的消息"""
            range = 210
            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)
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月23日
  • 已采纳回答 2月15日
  • 创建了问题 2月15日

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)