我正在尝试创建一个表示拼接房间的列表,每个元素都初始化为False。下面是我的初始化,最后我添加了一个打印循环,所以我可以确保它有效。
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。
答案 0 :(得分:4)
您应该在self.room
方法中将变量空间设置为__init__
,然后在语句中再次将其称为self.room
:
for row in self.room:
现在,您的变量room
仍然是__init__
函数的本地变量。
答案 1 :(得分: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