Python:为什么这个AttributeError在缩进改变之后消失了

2024-10-03 23:30:16 发布

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

我希望你能在你的机器上复制这个错误。我不明白为什么下面的代码给了我一个错误【粘贴在后面】,当我让__str__方法与方法__init__和{}对齐时。我已经从这个link编写了部分类,但是在__str__中给我的变量起了不同的命名。当我得到错误,我只是粘贴代码从链接和它的工作。在

就在这一点上,我意识到我对__str__方法的缩进与其他方法的缩进不一致。当我将所有内容放入相同的缩进中时,我遇到了相同的错误,因此我将方法返回到其先前的实现中,并得到以下输出:<__main__.Vertex object at 0x1079b4128>为什么会这样?我不应该从一开始就得到一个IndentationError?当我缩进我自己版本的__str__方法并给它更多的缩进时,我没有得到任何错误。为什么?有人能复制这个错误吗?在

class Vertex:
  def __init__(self, key):
    self.id = key
    self.connectedTo = {}

  def addNeighbor(self, neighbor, weight=0):
    self.connectedTo[neighbor] = weight

    def __str__(self):
      return str(self.id) + " connected to: " + str([vertex.id for vertex in self.connectedTo])

    # def __str__(self):
    #   return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])

if __name__ == '__main__':
  vertex = Vertex(1)
  vertex.addNeighbor('1', 20)
  vertex.addNeighbor('2', 10)
  print(vertex)

我得到的错误是:

^{pr2}$

Tags: 方法key代码selfidinitmain粘贴
2条回答

这是因为使用您的缩进,__str__是方法addNeighbor中的一个局部函数。它只在addNeighbor的范围内可见。如果没有用户定义的__str__,则使用默认方法。在

最初的错误是因为x.id中的x是一个字符串(节点名)。字符串没有id属性。要使代码正常工作,请将vertex.addNeighbor('1', 20)等更改为vertex.addNeighbor(Vertex('1'), 20)。在

这里发生了一些事情。在

首先,正如您所说,您的__str__缩进是错误的。但它仍然是一个有效的缩进,这就是为什么您不能得到IndentationError。只有在调用__str__时才会出现错误,只有当它处于正确的缩进级别时才会发生,这是较小的缩进,与__init__和{}一致。(否则,它只是addNeighbor中的一个局部函数,而且非常无用。)

一旦调用了__str__方法,您得到的错误是由于self.connectedTo字典的结构造成的。在addNeighbor()中,您正在映射neighbor: weight,其中neighbor作为str传入,而权重作为int传入。当您在[x.id for x in self.connectedTo]中迭代字典时,Python将迭代该字典的,在本例中是neighbor,一个字符串。所以x变成了一个字符串。(列表理解最好写为[x.id for x in self.connectedTo.keys()],这与原来的相同,但更清晰。)

您链接的页面显示了最初的错误,即neighbor应该是另一个Vertex,而不是str。这意味着这一切都归结为向addNeighbor()传递了错误类型的参数。考虑到这一点,我可能会像这样重写你的测试代码。。。在

class Vertex:
  def __init__(self, key):
    self.id = key
    self.connectedTo = {}

  def addNeighbor(self, neighbor, weight=0):
    self.connectedTo[neighbor] = weight

  def __str__(self):
    return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])

if __name__ == '__main__':
  vertex = Vertex(1)
  vertex.addNeighbor(Vertex(1), 20) # This creates a second Vertex with the same ID
                                    # as `vertex`   probably not what you intend?
  vertex.addNeighbor(Vertex(2), 10)
  print(vertex)


# Output:
1 connected to: [1, 2]

相关问题 更多 >