在Python 2.7.6中,对象被视为非类型
有一个类Tree234,它只有一个成员_pRoot,这是一个节点类型的对象。这里的节点本身就是一个类 现在,当我试图在Tree234类的任何方法中直接使用_pRoot时,它都起作用了。但是,当我试图通过一个临时变量将其与_pRoot相等来使用它时,它就不起作用了 以下是相关代码:在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
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正在蓬勃发展:)谢谢