2015-11-01 13 views
0

我試圖創建一個象徵平鋪房間的列表,並且每個元素都被初始化爲False。下面是我的初始化,我在最後添加了一個打印循環,所以我可以確保它的工作。爲什麼我可以從__init__打印這個列表,而不是從__str__方法

class Room(object): 
    def __init__(self,width,height): 
     #create a room of size width x height populated with False 
     room = [[False for i in range(width)] for j in range(height)] 
     #print statement to verify it worked 
     for row in room: print row 

這產生了一個很好的矩陣,看起來像一個平鋪的房間。然後我嘗試編寫一個__str__方法,以相同的格式輸出對象。

def __str__(self): 
    for row in self: 
     print row 

我想這個,所以我可以檢查矩陣,因爲我是操縱它,但是當我嘗試做

print object 

我總是

TypeError: 'Room' object is not iterable 

爲什麼將這項工作在__init__但不在__str__方法?我仍然圍繞着OOP。眼下

for row in self.room: 

您的變量room依舊是局部的__init__功能:

回答

4

你應該在__init__方法創建可變一房self.room,稍後再稱其爲self.room在聲明。

+1

不僅如此,他試圖循環「自我」......是的,我知道你知道這一點。 –

+0

好的,爲了讓這個方法以外的東西可用,我必須在它前面有自己的東西(比如self.room)?這就說得通了。是的,我讓自己循環,因爲我不確定還有什麼要告訴它自己循環。我知道自己必須在那裏。感謝大家的幫助。 – largedon

+2

你也不想從'__str __()'打印。你想要返回一個字符串。 – Kevin

1

因爲您尚未在班級中實施__iter__方法。儘管你不需要一個你想要的東西來完成:

class Room(object): 
    def __init__(self,width,height): 
     self.room = [[False for i in range(width)] for j in range(height)] 
     for row in self.room: 
      print row 

    def __str__(self): 
     for row in self.room: 
      print row 

您可以self迭代通過在你的類實現一個__iter__()方法:

class Room(object): 
    ... 
    def __iter__(self): 
     for x in self.room: 
      yield x 

會讓你的類迭代:

>>> r =Room() 
>>> r 
<__main__.Room instance at 0x02A02620> 
>>> for x in r: 
     print(x) 
0 
1 
2 
3 
4 
相關問題