我实际上已经完成了这个练习(差不多),但我只是遇到了__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)
提前致谢。
答案 0 :(得分:3)
如果您需要使用__str__
方法,那么您应该从中返回一个字符串 - 类似这样的
def __str__(self):
return 'Critter object: %s %s %s' %(self.name, self.hunger, self.boredom)
请阅读文档here
答案 1 :(得分: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()
打印的是返回值。
答案 2 :(得分: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
答案 3 :(得分:0)
或者,如果您不想对 str 属性进行硬编码,则可以像这样执行
def __str__(self):
return ', '.join(['{key}={value}'.format(key=key, value=self.__dict__.get(key)) for key in self.__dict__])