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循环逻辑存在计算错误:
- 循环内调用
get_pizza_info后没有重新给size/meats/veg/quantity赋值,也没有重新计算pizza_total,多次点披萨时金额不会更新 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
相关产品推荐
相关产品推荐

