我在学习《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.

题主,你的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)

"""一组可用于表示燃油汽车和电动汽车的类"""


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
        else:
            range = 210
        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_tesla = ElectricCar('tesla', 'mosel s', 2016)

print(my_tesla.get_descriptive_name())
my_tesla.bettery.describe_bettery()
my_tesla.bettery.get_range()

img

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632