Python线上玩具店OOP开发遇AttributeError: 'str'对象无price属性求助
报错根本原因
- 你往购物车列表
shopping_cart中添加的是用户输入的字符串,而非匹配到的Products类实例:在ShoppingCart的add_products方法中,你通过input拿到的item是字符串类型,匹配到对应的产品实例obj后,执行了shopping_cart.append(item),而非shopping_cart.append(obj)。后续计算总价遍历购物车时,尝试访问字符串的price属性,自然触发属性不存在的报错。 - 附加错误点:
- 存在循环导入问题:
shopping_cart.py导入products模块,products.py又导入shopping_cart模块,会导致程序初始化报错。 Products类的price属性存储的是字符串类型(你初始化时用了'15.00'这类带引号的写法),后续计算总价时无法直接做数值累加。- 大量滥用全局变量:
shopping_cart、products都用了全局变量,不符合面向对象设计逻辑,也容易出现变量作用域混乱问题。 - 代码缩进逻辑错误:
Products类的listProducts方法下的循环缩进层级错误,属于类级别的代码,模块导入时就会执行,提前触发未定义变量报错;removeProduct方法缩进错误,嵌套在了addProduct方法内部。 - 总价计算逻辑错误:
totalprice方法中定义了total变量但没有做累加,仅输出了最后一个商品的价格,计算结果不符合预期。
- 存在循环导入问题:
解决方案
- 修正添加商品的逻辑,将
add_products方法中的shopping_cart.append(item)改为shopping_cart.append(obj) - 移除循环导入:删除两个模块中互相导入的语句,将全局商品列表
products、购物车列表放到独立的主程序入口文件中维护 - 修改
Products实例初始化的price为数值类型,比如将'15.00'改为15.00 - 重构
ShoppingCart类,将购物车列表改为实例属性,避免全局变量污染:
class ShoppingCart: def __init__(self): # 购物车列表作为实例属性维护 self.shopping_cart = [] # 后续方法中所有用到shopping_cart的地方都改为self.shopping_cart
- 修正总价计算逻辑:
def totalprice(self): total = 0 for i in self.shopping_cart: total += i.price print(f'Your total is £{total}') # 如果需要结算后清空购物车再执行清空 self.shopping_cart = []
- 统一修正所有代码的缩进层级,把
listProducts方法的循环缩进至方法内部,把removeProduct方法的缩进调整为和其他类方法平级。
内容的提问来源于stack exchange,提问作者user17205637
相关产品推荐
相关产品推荐

