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

Python报AttributeError: 'Function'对象无order_total属性问题问询

报错原因
  • 你混淆了函数局部变量和函数对象属性的概念:order_total是take_customer_order运行时生成的局部变量,仅在函数执行上下文内有效,不会自动成为function对象的属性,直接访问take_customer_order.order_total必然触发属性不存在的报错。
  • 你额外加的括号take_customer_order.order_total()相当于把不存在的属性当成函数调用,逻辑完全错误。
  • 你写的make_order_total_global函数没有任何实际作用,无法实现将局部变量全局化的需求。
解决方案

方案1:直接使用函数返回值(最推荐)

你现有的take_customer_order已经在最后返回了(order_total, pizza_total)两个值,完全不需要额外做全局化处理,只需修改run_roccos_pizza_shop中的调用逻辑即可:

def run_roccos_pizza_shop():
    revenue = 0
    patron_num = 0
    while True:
        partynum = input("Enter number in party or 'Close' to quit. ")
        if partynum.upper() == "CLOSE":
            print("Have a nice day!")
            break
        else:
            patron_num += int(partynum)
        # 调用下单函数,接收返回的订单总金额,不需要的pizza_total用_占位
        order_total, _ = take_customer_order()
        # 处理用户未下单的场景:此时函数提前返回print,返回值为None
        if order_total is not None:
            revenue += order_total
    print("Customers served: ", patron_num)
    print("Total revenue $", "{:,.2f}".format(revenue))
    return patron_num, revenue

方案2:使用全局变量(不推荐,仅做参考)

如果确实需要全局存储order_total,可以直接声明全局变量,不要尝试给函数对象加属性:

# 全局作用域先定义变量
order_total = 0

def take_customer_order():
    # 声明函数内使用的是全局的order_total
    global order_total
    # 剩下的原有逻辑不变

之后其他函数可以直接读取全局作用域的order_total值,但该方案容易出现变量被意外修改的问题,调试难度高,不建议使用。

现有代码额外BUG提示

你当前的take_customer_order循环逻辑存在计算错误:

  1. 循环内调用get_pizza_info后没有重新给size/meats/veg/quantity赋值,也没有重新计算pizza_total,多次点披萨时金额不会更新
  2. pizza_total = (size_cost + meats_cost + veg_cost * quantity)的括号位置错误,应该是总单价乘以数量:pizza_total = (size_cost + meats_cost + veg_cost) * quantity
    修改后的循环逻辑参考:
while new_pizza != "N":
    new_pizza = input("Order a pizza?  (Y/N) ")
    if new_pizza.upper() == "N":
        break
    # 重新接收新披萨的参数
    size, meats, veg, quantity = get_pizza_info(size, meats, veg, quantity)
    # 重新计算当前披萨金额
    if size == 1:
        size_cost = 6.50
    elif size == 2:
        size_cost = 9.50
    elif size == 3:
        size_cost = 11.50
    meats_cost = (meats - 1) * 3.50
    veg_cost = (veg - 1) * 1.50
    pizza_total = (size_cost + meats_cost + veg_cost) * quantity
    print("Pizza total: $", "{:,.2f}".format(pizza_total))
    order_total += pizza_total

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:15:08