为什么我可以从\uuu init\uuuuuuu打印这个列表,而不能从\uuuu str\uuuu方法打印

2024-03-28 19:09:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个列表,它象征一个平铺的房间,并且每个元素都被初始化为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__方法中无效?我仍然在绕着我的头。你知道吗


Tags: inselffalseforobjectinitdefwidth
2条回答

您应该在__init__方法中将变量室创建为self.room,然后在语句中将其再次引用为self.room

for row in self.room:

现在变量room仍然是__init__函数的局部变量。你知道吗

因为您还没有在类上实现__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

通过在类上实现__iter__()方法,可以使selfiterable:

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

相关问题 更多 >