如何解密[<__ main__.Food对象,位于0x1097ba828>

时间:2018-06-29 22:32:39

标签: python python-3.x

我是python新手。我想显示实际的names,values and calories而不是[<__main__.Food object at 0x1097ba828>, <__main__.Food object at 0x1097ba860>, <__main__.Food object at 0x1097ba898>]我知道这个问题很简单,但是如果您让我知道答案的话,那将对您有很大的帮助!

class Food(object):
    def __init__(self,n,v,w):
        self.name = n
        self.value = v
        self.calories = w

    def getValue(self):
        return self.value

    def getCal(self):
        return self.calories

    def density(self):
        return self.getValue()/self.getCal()

    def __str__(self):
        return '<__main__.Food: '+self.name +' '+ self.value+' ' + self.calories

    def buildMenu(self):
        menu = []
        for i in range(len(values)):
            menu.append(Food(self.name[i], self.value[i], self.calories[i]))
        return menu

names=['burger','fries','coke']
values=[1,2,3]
calories=[100,200,300]

if __name__ == '__main__':
    new = Food(names, values, calories)
    print(new.buildMenu())

谢谢!

3 个答案:

答案 0 :(得分:1)

我进行了两个代码更改,以获取我认为您要查找的内容。第一种是在 str 函数中将值转换为字符串。第二个就是使用它。

None
None
None
Some(42)

def __str__(self):
    return '<__main__.Food: '+ str(self.name) +' '+ str(self.value)+' ' + str(self.calories)

现在输出为:

  

<< strong>主要。食物:['汉堡','薯条','可乐'] [1、2、3] [100、200、300]

答案 1 :(得分:0)

这就是我要这样做的方式,请注意我们已经创建了两个类:单独的MenuMenu类。 add类具有一个foodItems方法追加到其m.foodItems = < some list of Food objects > 属性中,尽管我认为这不是真正必要的,因为我们可以直接进行属性分配:

buildMenu

我从Food类中删除了令人困惑的__str__方法,并为两个类都定义了class Food(object): def __init__(self,n,v,w): self.name = n self.value = v self.calories = w def getValue(self): return self.value def getCal(self): return self.calories def density(self): return self.getValue()/self.getCal() def __str__(self): return '\t'.join([self.name, str(self.value), str(self.calories)]) class Menu(object): def __init__(self): self.foodItems = [] def add(self, foodItem): self.foodItems.append(foodItem) def __str__(self): """ prints the food items """ s = 'Item\tValue\tCalories\n' s += '\n'.join(str(f) for f in self.foodItems) return s names=['burger','fries','coke'] values=[1,2,3] calories=[100,200,300] m = Menu() items = list(Food(n,v,c) for n,v,c in zip(names,values,calories)) m.foodItems = items print(m) 方法:

echo $row['rmb4'];

输出类似:

enter image description here

答案 2 :(得分:0)

您遇到的问题是您要打印Food个实例的列表,而不是一次打印一个实例。 list类型的__str__操作符在列表包含的项目上调用repr,而不是str,因此您的__str__方法不会运行。

一个简单的解决方法是将您的__str__方法重命名为__repr__

我注意到,您正在构建一个Food实例,其中包含namevaluecalories的值列表,这有点奇怪。您可以在其上调用一个方法以列出包含各个值的Food实例。更具Pythoic的方法是将列表传递到返回实例列表的classmethod,而无需存在中间实例:

@classmethod
def buildMenu(cls, names, values, calories):
    menu = []
    for i in range(len(values)):        # consider using zip instead of looping over indexes
        menu.append(cls(names[i], values[i], calories[i]))
    return menu

您将在课堂上称呼它

if __name__ == '__main__':
    print(Food.buildMenu(names, values, calories))