You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python线上玩具店OOP开发遇AttributeError: 'str'对象无price属性求助

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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:06:02