2013-07-04 50 views
0

我已經實際完成了這個練習(差不多),但是我只是在__str__這個對象內停留在一個小問題上。如果我這樣做從對象中打印Python __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

這是無關緊要的,但請注意,您的構造函數參數將僅被評估一次,而不是每個實例的創建(請參閱http://docs.python-guide.org/en/latest/writing/gotchas。html#mutable-default-arguments) – justinas

回答

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) 

,因爲它是返回值由01印刷。

+0

同樣的事情發生了,第一個解決方案提出了這種事情[<__ main __。在0x02B54AD0上的Critter對象>,第二個解決方案只打印一個元素。我需要首先實現__repr__的事情嗎? –

+0

我按照你的指示,但是這一次我刪除了try語句,並且我得到了這個'expected str instance,int found' –

+0

@jimmyLight:切換到字符串格式,當插入時將所有參數轉換爲'str()'。一個或多個'self.'屬性是一個'int',我沒有考慮到這一點。 –

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 
+0

這就是我第一次這樣做,我剛剛嘗試再次打印(sworm),就像本書告訴我的,它給出了這個[<__ main __。Critter object at 0x02B54AD0> –

3

如果您需要__str__方法來工作,那麼你應該從它返回一個字符串 - 像這樣

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

請閱讀文檔here

+0

@MartijnPieters那麼OP說他們有問題'__str__'方法,並且'return'語句丟失。我認爲這很公平。 – ersran9

+0

是的,你是對的; '__str__'中的'print()'語句是發生問題的最佳指標。 –

0

或者如果你不想硬編碼你的str屬性你可以這樣做

def __str__(self): 
    return ', '.join(['{key}={value}'.format(key=key, value=self.__dict__.get(key)) for key in self.__dict__])