【问题标题】:Why am I getting a " instance has no attribute '__getitem__' " error?为什么我收到“实例没有属性 '__getitem__'”错误?
【发布时间】:2015-05-27 21:02:49
【问题描述】:

代码如下:

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) 回溯(最近一次通话最后): 文件“C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py”,第 108 行,在 主要的() 文件“C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py”,第 102 行,在 main 树 = buildParseTree(parseData) 文件“C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py”,第 46 行,在 buildParseTree currentTree = currentTree.getLeftChild() 文件“C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py”,第 15 行,在 getLeftChild 返回根[1] AttributeError:BinaryTree 实例没有属性“__getitem__”

【问题讨论】:

    标签: python


    【解决方案1】:

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

    让我们看看如果您致电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 ;)

    【讨论】:

      【解决方案2】:

      您的第一个问题是root 应该是self.root

      您的第二个问题是:

      def getLeftChild(root):
          return root[1]
      

      您正在用新的含义重新定义词根。

      【讨论】:

        【解决方案3】:

        正如 PreludeAndFugue 所说,您应该修复格式。但据我所知,您在 BinaryTree 中的类方法中至少存在一个错误:它们中的大多数甚至没有将 self 作为参数。解决这个问题,也许你会过得更好。

        【讨论】:

        • 我实际上刚刚做了同样的事情,并且在回顾这里之前它确实有效。谢谢两位的反馈。我计划更多地使用这个网站来解决我的问题。
        • 但现在我遇到了另一个问题。在我的 postorder(tree) 中,它找到了给它的二叉树的发布顺序,但我得到了一个错误,如下所示: Traceback (most recent call last): File "", line 1, in main() File "C:\Users\Kevin\Desktop\Python Stuff\Assignment 11\parseTree.py",第 106 行,在 main print("The post order is: ", + postorder(tree)) TypeError : 一元操作数类型错误 +: 'NoneType' 有什么想法吗?考虑到它开头的检查,我不明白为什么它会出现“NoneType”错误。
        • 我认为您正在尝试打印一个字符串,然后是一个变量的值,是吗?我想我看到了发生错误的那一行。我建议删除“+”。在 python 中,你可以说: print "The value of 5 is:", 5 它会像你期望的那样工作。如果你在那里扔一个“+”,那是不好的语法。如果你真的想使用“+”,请执行 print "The value of 5 is:" + str(5)。 “+”运算符用于连接字符串,因此在您的示例中使用不当。
        • PS:以后,请在您的代码中添加注释以注释行号。它使您可以更轻松地将代码追溯到确切的错误行
        猜你喜欢
        • 2014-06-17
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 2023-02-05
        相关资源
        最近更新 更多