为什么我可以从__init__打印此列表,但不能从__str__方法

时间:2015-11-01 18:52:08

标签: python list python-2.7 oop

我正在尝试创建一个表示拼接房间的列表,每个元素都初始化为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。

2 个答案:

答案 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