使用子类对象访问父类全局变量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
相关产品推荐
相关产品推荐

