You need to enable JavaScript to run this app. 使用子类对象访问父类全局变量available_cars报UnboundLocalError如何解决
优惠活动
大模型
产品
解决方案
定价
更多

使用子类对象访问父类全局变量available_cars报UnboundLocalError如何解决

错误原因

触发UnboundLocalError: local variable 'available_cars' referenced before assignment的核心原因是:在父类的update_invetory方法中尝试修改全局变量available_cars时,没有显式声明变量的全局作用域。Python默认会将方法内部被赋值的变量识别为局部变量,运行赋值语句available_cars = available_cars - cars_rented时,会优先查找局部作用域的available_cars,但此时该局部变量还未完成赋值,因此触发引用错误。

同时原有代码还存在两处隐性问题:

  • rent_hourly方法的判断逻辑顺序错误,小于0的校验分支永远不会被触发
  • 全局变量的封装性极差,容易被其他代码意外修改

修复方案

提供两种可选修复方案,第二种类属性方案更适合正式项目使用。

方案1:保留全局变量,补充作用域声明

如果要保留原有的全局变量写法,只需要在修改全局变量的方法开头添加global声明即可:

# 修改父类的update_invetory方法
def update_invetory(self, cars_rented):
    # 显式声明此处使用的是全局作用域的available_cars
    global available_cars
    # 补充合法性校验,避免车辆数被扣为负数
    if 0 < cars_rented <= available_cars:
        available_cars -= cars_rented

注:如果后续其他方法也要修改该全局变量,同样需要添加global声明,仅读取变量不需要额外声明。

方案2:改为类属性实现(推荐)

将车辆计数器定义为父类的类属性,所有实例(包括子类实例)共享同一个计数,不需要依赖全局变量,封装性和可维护性更好:

# 修改后的父类核心代码
class Car_rental():
    # 定义为类属性,所有实例共享
    available_cars = 1000
    def __init__(self):
        pass

    def display_available_cars(self):
        print("当前可供租赁的车辆总数为:", Car_rental.available_cars)

    def rent_hourly(self, cars_rented):
        print("我们的小时租赁价格为100元/小时。")
        # 修正判断逻辑顺序
        if cars_rented < 1:
            print("请输入有效的租赁车辆数。")
        elif cars_rented > Car_rental.available_cars:
            print("抱歉,当前可用车辆不足,若您需要最多可租赁{}辆。".format(Car_rental.available_cars))
        else:
            print("感谢您从Swift租车平台租赁{}辆汽车,祝您出行愉快。".format(cars_rented))

    def update_invetory(self, cars_rented):
        if 0 < cars_rented <= Car_rental.available_cars:
            Car_rental.available_cars -= cars_rented

# 其余未修改的父类方法、子类代码保持原有逻辑即可

内容的提问来源于stack exchange,提问作者Raja Panchal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 23:42:01