在Python 2.7.6中,对象被视为非类型

在Python 2.7.6中,对象被视为非类型,python,object,nonetype,Python,Object,Nonetype,有一个类Tree234,它只有一个成员_pRoot,这是一个节点类型的对象。这里的节点本身就是一个类 现在,当我试图在Tree234类的任何方法中直接使用_pRoot时,它都起作用了。但是,当我试图通过一个临时变量将其与_pRoot相等来使用它时,它就不起作用了 以下是相关代码: class Tree234: #_pRoot = None def __init__(self): self._pRoot = Node() def find(self, k

有一个类Tree234,它只有一个成员_pRoot,这是一个节点类型的对象。这里的节点本身就是一个类

现在,当我试图在Tree234类的任何方法中直接使用_pRoot时,它都起作用了。但是,当我试图通过一个临时变量将其与_pRoot相等来使用它时,它就不起作用了

以下是相关代码:

class Tree234:
    #_pRoot = None

    def __init__(self):
        self._pRoot = Node()

    def find(self, key):
        pass

    def insert(self, dValue):
        pCurNode = self._pRoot
        pTempItem = DataItem(dValue)

        while True:
            if pCurNode.isFull():
                self.split(pCurNode)
                pCurNode = pCurNode.getParent()
                pCurNode = self.getNextChild(pCurNode, dValue)

            elif pCurNode.isLeaf():
                break

            else:
                pCurNode = self.getNextChild(pCurNode, dValue)
        pCurNode.insertItem(pTempItem)
insert()中的第一条语句没有执行它应该执行的操作。当控件到达while循环中的第一条语句时,我遇到以下错误:

AttributeError:“非类型”对象没有属性“isFull”

如果我只是用这个语句替换while循环中的第一个语句(只是为了测试):

它接受该属性并向前移动(为其他此类语句引发相同的错误,如这里的elif条件中的语句)

因此这里很清楚,
pCurNode
被视为无类型,而不是使用语句
pCurNode=self将其分配给节点类型对象

我已经花了几个小时试图弄明白,但我仍然一点也不知道这里发生了什么。所以我决定问问你们。 我知道这里有一件非常愚蠢的事情,那就是造成问题的原因。但是我想不出来

你能在这里找到问题吗?

(添加注释作为答案)

您应该在
while
子句中检查
pCurNode是否为None
,如:
whilepcurnode:
whilepcurnode不是None:
这是您的问题

发生这种情况是因为循环可能不会在叶中退出

else:
   pCurNode = self.getNextChild(pCurNode, dValue) 
可能找不到下一个孩子

类似地,对于其他语句,节点可能无法找到任何下一个子级或父级(因此返回类似
None
-like的值)

最后,在像这样插入支票之前:

if pCurNode and pCurNode.isLeaf():  # insert data here
(添加评论作为答案)

您应该在
while
子句中检查
pCurNode是否为None
,如:
whilepcurnode:
whilepcurnode不是None:
这是您的问题

发生这种情况是因为循环可能不会在叶中退出

else:
   pCurNode = self.getNextChild(pCurNode, dValue) 
可能找不到下一个孩子

类似地,对于其他语句,节点可能无法找到任何下一个子级或父级(因此返回类似
None
-like的值)

最后,在像这样插入支票之前:

if pCurNode and pCurNode.isLeaf():  # insert data here

那么
pCurNode.getParent()
self.getNextChild(pCurNode,dValue)
返回什么呢?其中一个返回了
None
,然后在
循环时返回到
,然后返回错误。那么
pCurNode.getParent()
self.getNextChild(pCurNode,dValue)
返回什么呢?其中一个返回了
None
,然后在
循环时返回到
,然后返回错误。这可能是罪魁祸首,我相信OP假设这发生在循环的第一次迭代中,更可能的答案是getNextChild()或getParent()方法没有返回任何结果。@Nate,不管他怎么说,当直接用变量测试时,它会工作,然后会失败。没错,是的,这就是他所假设的,在这个答案上+1,这是他问题的最可能原因。@NikosM。您的猜测是对的,由于isLeaf()中存在一个基本缺陷,叶块中没有退出循环。这是一个幼稚的错误:-/刚刚更正了该代码并更正了所有其他错误,现在我的树234正在蓬勃发展:)谢谢这可能是罪魁祸首,我相信OP假设这发生在循环的第一次迭代中,更可能的答案是getNextChild()或getParent()方法没有返回任何结果。@Nate,不管他怎么说,当直接用变量测试时,它会工作,然后会失败。没错,是的,这就是他所假设的,在这个答案上+1,这是他问题的最可能原因。@NikosM。您的猜测是对的,由于isLeaf()中存在一个基本缺陷,叶块中没有退出循环。这是一个天真的错误:-/刚刚更正了该代码并更正了所有其他错误,现在我的Tree234正在蓬勃发展:)谢谢