为什么出现“实例没有属性'__getitem__'”错误?

11
这里是代码:

class BinaryTree:
    def __init__(self,rootObj):
        self.key = rootObj
        self.left = None
        self.right = None
        root = [self.key, self.left, self.right]

    def getRootVal(root):
        return root[0]

    def setRootVal(newVal):
        root[0] = newVal

    def getLeftChild(root):
        return root[1]

    def getRightChild(root):
        return root[2]

    def insertLeft(self,newNode):
        if self.left == None:
                self.left = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.left = self.left
            self.left = t

    def insertRight(self,newNode):
        if self.right == None:
            self.right = BinaryTree(newNode)
        else:
            t = BinaryTree(newNode)
            t.right = self.right
            self.right = t

def buildParseTree(fpexp):
    fplist = fpexp.split()
    pStack = Stack()
    eTree = BinaryTree('')
    pStack.push(eTree)
    currentTree = eTree
    for i in fplist:
        if i == '(':
            currentTree.insertLeft('')
            pStack.push(currentTree)
            currentTree = currentTree.getLeftChild()
        elif i not in '+-*/)':
            currentTree.setRootVal(eval(i))
            parent = pStack.pop()
            currentTree = parent
        elif i in '+-*/':
            currentTree.setRootVal(i)
            currentTree.insertRight('')
            pStack.push(currentTree)
            currentTree = currentTree.getRightChild()
        elif i == ')':
            currentTree = pStack.pop()
        else:
            print "error:  I don't recognize " + i
    return eTree

def postorder(tree):
    if tree != None:
        postorder(tree.getLeftChild())
        postorder(tree.getRightChild())
        print tree.getRootVal()

def preorder(self):
    print self.key
    if self.left:
        self.left.preorder()
    if self.right:
        self.right.preorder()

def inorder(tree):
    if tree != None:
        inorder(tree.getLeftChild())
        print tree.getRootVal()
        inorder(tree.getRightChild())

class Stack:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

def main():
    parseData = raw_input( "Please enter the problem you wished parsed.(NOTE: problem must have parenthesis to seperate each binary grouping and must be spaced out.) " )
    tree = buildParseTree(parseData)
    print( "The post order is: ", + postorder(tree))
    print( "The post order is: ", + postorder(tree))
    print( "The post order is: ", + preorder(tree))
    print( "The post order is: ", + inorder(tree))

main()

以下是错误信息:

请在需要解析的问题中输入正确的内容。(注:问题必须用括号分隔每个二进制组,且必须有空格。)(1 + 2)
Traceback (most recent call last):
  File "C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py", line 108, in 
    main()
  File "C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py", line 102, in main
    tree = buildParseTree(parseData)
  File "C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py", line 46, in buildParseTree
    currentTree = currentTree.getLeftChild()
  File "C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py", line 15, in getLeftChild
    return root[1]
AttributeError: BinaryTree实例没有'__getitem__'属性。
3个回答

22

因为你声明了错误的方法:

让我们看一下如果你调用tree.getRootVal()会发生什么。 .getRootVal()被这样声明:

def getRootVal(root):
    return root[0]

你可能已经知道,传递给方法的第一个参数始终是实例,并且它是隐式提供的。因此,你基本上尝试将BinaryTree的实例视为序列(root[0])。

你必须以这种方式指定:

class BinaryTree:
    def __init__(self,rootObj):
        self.key = rootObj
        self.left = None
        self.right = None
        self.root = [self.key, self.left, self.right]   # self.root

    def getRootVal(self):
        return self.root[0]   # access self.root

    def setRootVal(self, newVal):
        self.root[0] = newVal

    # and also the other functions

对象方法的第一个参数不一定要被称为self,但使用这种方式可以避免像你那样的错误。

有趣的是,您正确地声明了insertLeftinsertRight ;)


1

你的第一个问题是 root 应该改为 self.root

你的第二个问题在这里:

def getLeftChild(root):
    return root[1]

你正在用新的含义重新定义根。


0
正如PreludeAndFugue所说,您应该修复格式。但是从我了解的情况来看,BinaryTree中的大多数类方法甚至都没有将self作为参数。先修正这个问题,或许您会好一些。

我刚刚做了同样的事情,在回到这里之前它是有效的。谢谢你们两个的反馈。我计划在以后经常使用这个网站来解决我的问题。 - Kevin Yusko
但是现在我遇到了另一个问题。在我的后序遍历函数(postorder(tree))中,它可以找到给定二叉树的后序遍历,但是我却遇到了以下错误:Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> main() File "C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py", line 106, in main print( "The post order is: ", + postorder(tree)) TypeError: bad operand type for unary +: 'NoneType'有什么想法吗?考虑到它开头的检查,我不明白为什么会出现“NoneType”错误。 - Kevin Yusko
我认为你想要打印一个字符串和一个变量的值,是吗?我想我看到了你的错误发生的那一行。我建议去掉“+”号。在Python中,你可以这样说:<code>print "The value of five is:", 5</code>,它会按照你的预期工作。如果你在其中加入“+”,那就是错误的语法。如果你真的想使用“+”,那么请这样做:<code>print "The value of five is:" + str(5)</code>。"+"运算符用于连接字符串,因此在你的例子中被错误地使用了。 - inspectorG4dget
请在以后的编程中,在代码注释中添加行号。这样可以更容易地追踪到代码错误所在的确切行。 - inspectorG4dget

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接