python全局名称未定义使用类的问题

时间:2018-02-18 16:48:50

标签: python class

我正在创建一类客户购物车,所以我创建了一类产品,然后用购物篮创建了添加,删除和清空篮子的方法。 现在我想用BOGOF报价计算一篮子的价格总和。 我的问题在于'总计'方法,错误是'全局名称x未定义'。

我的问题是我需要编写代码,因为购物车中的东西是产品类实例的名称属性。我无法找到另一种方法将产品附加到购物车上。或列出所以希望我没有在那里犯错。我不明白为什么会出现这样的错误,而不是“添加项目”中的错误。我使用item.quantity的方法。

我的猜测是,不同之处在于该项是该函数域的一部分,但x不是。我不认为我的总方法需要任何其他输入。我只需要自我,因为每个人都有一个篮子,这就是我所需要的。

感谢您的帮助

class products:
  def __init__(self,name,price,quantity):
    self.price=price
    self.quantity=quantity
self.productname=name



class ShoppingBasket:
  def __init__(self,name,basket=[]):
    self.name=name
    self.basket=basket[:]






def additems(self,*items):

for item in items: 

    if item.quantity>0:

      self.basket.append(item.productname)
      item.quantity-=1
      print  "%s has been added to %s's basket"%(item.productname, self.name)
    else:
      print "sorry item is not in stock"



  def removeitems(self,*items):

for item in items:
  if item.productname in self.basket:
    self.basket.remove(item.productname)
    item.quantity+=1

    print "%s has been removed from %s's basket"%(item.productname,self.name) 
  else: print "not in basket"


  def empty(self):
    self.basket[:]=[]
    print "%s's basket is empty"%(self.name)

  def total(self):
    total=0

    for x.productname in self.basket:
      z=[s for s in self.basket if s==x.productname ]
      if len(z)%2==0: 
        price=x.price*(len(z)/2)
      else: 
        price=x.price*(len(z)//2)+item.price
      total+=price
    return total

2 个答案:

答案 0 :(得分:2)

您不能像这样

迭代循环中的属性
for x.productname in self.basket:

您必须分配对象,然后获取它。

for x in self.basket:
    z=[s for s in self.basket if s==x.productname]

我没有遵循这个逻辑,但这似乎是一种非常低效的方式来整合所有产品。

例如,这将添加购物篮中物品的所有价格

return sum(x.price for x in self.basket) 

注意:item在循环中也未定义

要实施BOGOF优惠,我建议尝试不将项目添加到购物篮中(如果已经存在),尽管购买两件以上相同的商品可能效果不佳。 /> 我的观点是,如图所示,实际上只需要一条线来计算总数。在将项目添加到购物篮时,可以完成仅将奇数项目保持为总数的逻辑

答案 1 :(得分:0)

我找到了让它成功的方法。我已经定义了一个新属性:secretbasket用于保存所有类实例,而basket保存其名称(为了消费者的利益)。我的功能现在可以使用并处理BOGOF!

def total(self):
    total=0
    for x in self.secretbasket:
        z=[s for s in self.secretbasket if s==x]

        if len(z)%2==0:
            price=x.price*(len(z)/2)
            self.secretbasket=[s for s in self.secretbasket if s!=x ]
        else: 
            price=x.price*(len(z)//2)+x.price
            self.secretbasket=[s for s in self.secretbasket if s!=x ]
        print price
        total+=price
    return total