0

我实际上已经完成了这个练习(几乎),但我只是被困在__str__一个物体内部的一个小问题上。如果我这样做

elif choice == "9":
    try:
        for i in sworm:
            print(i)
    except TypeError:
        None` 

然后它只会打印出我列表中第一个对象的详细信息(那里只有 2 个对象),例如 - sworm = [crit,crit1]

当我尝试这个

elif choice == "9":
    try:
        print(sworm)
    except TypeError:
        None

然后我得到: -

[<__main__.Critter object at 0x02B54AD0>, <__main__.Critter object at 0x02B5B190>]

这是我的对象的前半部分

class Critter(object):
    """A virtual pet"""
    def __init__(self, name, hunger = random.randint(1,50), boredom = random.randint(1,50)):
        self.name = name
        self.hunger = hunger
        self.boredom = boredom



    def __pass_time(self):
        self.hunger += 1
        self.boredom += 1

    def __str__(self):

        print ("Critter object\n")
        print (self.name)
        print (self.hunger)
        print (self.boredom)

提前致谢。

4

4 回答 4

3

如果您需要该__str__方法工作,那么您应该从中返回一个字符串 - 像这样

def __str__(self):  
    return 'Critter object: %s %s %s' %(self.name, self.hunger, self.boredom)

请在此处阅读文档

于 2013-07-04T15:14:21.080 回答
2

Python 列表总是将内容显示为表示,调用repr()对象。

您也可以通过指定__repr__方法来挂钩。或者,不要直接打印列表,而只打印内容:

for elem in sworm:
    print(elem)

或将它们作为长字符串加入:

print(', '.join(map(str, sworm)))

确保您确实从您的__str__方法中返回了一个值:

def __str__(self):
    return "Critter object\n{}\n{}\n{}".format(self.name, self.hunger, self.boredom)

因为它是由 打印的返回值print()

于 2013-07-04T15:10:27.803 回答
0

问题是这样的:

    print ("Critter object\n")
    print (self.name)
    print (self.hunger)
    print (self.boredom)

看, __str__ 方法实际上不应该打印任何东西。相反,它应该返回它想要打印的内容。所以,你需要这样做:

    return "Critter object\n\n" + self.name + '\n' + self.hunger + '\n' + self.boredom
于 2013-07-04T15:13:39.550 回答
0

或者,如果您不想对str属性进行硬编码,您可以这样做

def __str__(self):
    return ', '.join(['{key}={value}'.format(key=key, value=self.__dict__.get(key)) for key in self.__dict__])
于 2017-04-08T03:34:20.570 回答