关于python:如何解密[< __ main__.Food对象在0x1097ba828>

How to decrypted [<__main__.Food object at 0x1097ba828>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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())

谢谢您!


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

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

1
print (str(new)) #instead of print(new.buildMenu())

现在输出为:


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

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

我注意到有点奇怪,您正在构建一个Food实例,其中包含namevaluecalories的值列表,这样您就可以调用它上的一个方法来生成具有单个值的Food实例列表。一种更为偏执的方法是将列表传递给返回实例列表的classmethod,而不需要存在中间实例:

1
2
3
4
5
6
@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

你可以在课堂上叫它:

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


我就是这样做的,注意到我们已经创建了两个类:一个单独的FoodMenu类。Menu类有一个add方法,该方法附加到其foodItems属性,尽管我觉得这不是真正必要的,因为我们可以直接进行属性分配:

1
m.foodItems = < some list of Food objects >

我已经从Food类中删除了混乱的buildMenu方法,并为这两个类定义了__str__方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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
'

        s += '
'
.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)

和输出,如:

enter image description here