2013-08-01 5 views
0

Я новичок на этом сайте, а также новичок в программировании, я пытаюсь изучить python, используя книгу для новичков на python 3.1. Я столкнулся с примером, который просто не будет работать, как я пытаюсь, я искал ошибки в письменной форме примерно в 10 раз, но это похоже на то, что я вижу в книге. Это пример:AttributeError: объект 'bool' не имеет атрибутов 'keys'

класс холодильник

#!/usr/bin/env 
class Fridge: 
    """methods: 
    has(food_name [, quantity])-chk if string is in the fridge 
    has_various(foods)-chk if enough food is in the fridge 
    add_one(food_name) -adds 1 food 
    add_many(food_dict)- adds dict to fridge 
    get_one(food_name)- take out 1 food 
    get_many(food_dict) - a dict out of fridge 
    get_ingred(food)- if passed an obj get the list of __ingredients__ 
    """ 
    def __init__(self, items={}) : 
     if type(items) != type({}): 
      raise typeError("Fridge req a dict but was given %s" % type(items)) 
     self.items=items 
     return 
    def __add_multi(self, food_name, quantity): 
     if (not food_name in self.items): 
      self.items[food_name]=0 
     self.items[food_name]=self.items[food_name]+quantity 
    def add_one(self, food_name): 
     if type(food_name) != type(""): 
      raise TypeError ("add_one requires a string givem a %s " % type(food_name)) 
     else: 
      self.__add_multi(food_name, 1) 
     return True 
    def add_many(self, food_dict): 
     if type(food_dict) != type({}): 
      raise TypeError ("add_many requires a dict, got a %s" % type(food_dict)) 
     for item in food_dict.keys() : 
      self.__add_multi(item, food_dict[item]) 
     return 
    def has(self, food_name, quantity=1): 
     return self.has_varoius({food_name:quantity}) 
    def has_various(self, foods): 
     try: 
      for food in foods.keys(): 
       if self.items[food] < foods[food]: 
        return False 
      return True 
     except KeyError: 
      return Fasle 
    def __get_multi(self, food_name, quantity): 
     try: 
      if (self.items[food_name] is None) : 
       return False 
      if (quantity > self.items[food_name]): 
       return False 
      self.items[food_name] = self.items[food_name] - quantity 
     except KeyError: 
      return False 
     return quantity 
    def get_one(self, food_name): 
     if type(food_name) !=type(""): 
      raise TypeError("get_one requires a string and was given a %s" % type(food_name)) 
     else: 
      result=self.__get_multi(food_name, 1) 
      return result 
    def get_many(self, food_dict): 
     if self.has_various(food_dict): 
      foods_removed={} 
      for item in food_dict.keys(): 
       foods_removed[item]=self.__get_multi(item, food_dict[item]) 
      return foods_removed 
    def get_ingredients(self, food): 
     try: 
      ingredients=self.get_many(food.__ingredients()) 
     except AttributeError: 
      return False 
     if ingredients!=False: 
      return ingredients 

омлета класс

#!/usr/bin/env python3.3 
class Omelet: 

    def __init__(self, kind="cheese"): 
     self.set_kind(kind) 
     return 

    def __ingredients__(self): 
     return self.needed_ingredients 

    def get_kind(self): 
     return self.kind 

    def set_kind(self, kind): 
     possible_ingredients=self.__known_kinds(kind) 
     if possible_ingredients == False : 
      return False 
     else: 
      self.kind=kind 
      self.needed_ingredients= possible_ingredients 

    def set_new_kind(self, name, ingredients): 
     self.kind=name 
     self.needed_ingredients= ingredients 
     return 

    def __known_kinds(self, kind): 
     if kind == "cheese": 
      return {"eggs":2, "milk":1, "cheese":1} 
     elif kind == "mushroom": 
      return {"eggs":2, "milk":1, "cheese":1, "mushroom":2} 
     elif kind == "onion": 
      return {"eggs":2, "milk":1, "cheese":1, "onion":1} 
     else: 
      return False 

    def get_ingredients(self, fridge): 
     self.from_fridge= fridge.get_ingredients(self) 

    def mix(self): 
     for ingredient in self.from_fridge.keys(): 
      print("mixing %d %s for the %s omelet" % (self.from_fridge["ingredient"], ingredient, self.kind)) 
     self.mixed=True 

    def make(self): 
     if self.mixed == True: 
      print("Cooking the %s omelet!" % self.kind) 
      self.cooked = True 

это, как я ссылаться на классы и то, что я сделать, чтобы использовать классы и ошибки я получаю

>>> exec(open("/home/knoppix/test/fridge.py").read()) 
>>> exec(open("/home/knoppix/test/omelet.py").read()) 
>>> o=Omelet("cheese") 
>>> f=Fridge({"cheese":5, "milk":4, "eggs":12}) 
>>> o.get_ingredients(f) 
>>> o.mix() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 41, in mix 
AttributeError: 'bool' object has no attribute 'keys' 

Прошу извинить меня, если в коде есть ошибка ввода текста, это именно то, что я нашел в книге!

ответ

2
def get_ingredients(self, fridge): 
    self.from_fridge= fridge.get_ingredients(self) 

В этой функции, ваш fridge.get_ingredients() может быть возвращение False.

So self.from_fridge имеет Boolean значение, которое не имеет keys() метод.

Возможно, вы захотите добавить соответствующую проверку в метод mix().

+0

может быть, но если он возвращается ложь, то вся программа не так, потому что это won't делать то, что он должен делать –

1

Функция «__known_kinds (kind)» должна предпочтительно возвращать {} для согласования, а не для разных типов объектов, хотя «None» лучше, чем «False».

if kind == "cheese": 
     return {"eggs":2, "milk":1, "cheese":1} 
    elif kind == "mushroom": 
     return {"eggs":2, "milk":1, "cheese":1, "mushroom":2} 
    elif kind == "onion": 
     return {"eggs":2, "milk":1, "cheese":1, "onion":1} 
    else: 
     return {} 

Тогда вам нужно иметь дело со словарным типом в методе mix(). Остальное также можно удалить из mix(), поскольку исключение будет добавлено, если dict == {}.

def mix(self): 
    if self.from_fridge == {}: 
     raise IndexError("self.from_fridge returns Nothing") 

    for ingredient in self.from_fridge.keys():  

....

Смежные вопросы