在Python 2.7.6中,对象被视为NoneType

时间:2015-05-01 13:18:11

标签: python object nonetype

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

现在,当我尝试在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:'NoneType'对象没有属性'isFull'

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

if self._pRoot.isFull():

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

所以在这里很明显pCurNode被视为None类型,而不是我使用语句pCurNode = self._pRoot

将其分配给Node类型对象的事实

这是几个小时我想弄清楚,但我仍然没有丝毫想到这里发生了什么。所以决定问你fellas。 我知道这里有一些非常愚蠢的东西,导致问题。但无法弄清楚。

你能在这里找到问题吗?

1 个答案:

答案 0 :(得分:4)

(添加评论作为答案)

您应该检查pCurNode is not None子句中while是否while pCurNode:while pCurNode is not None:else: pCurNode = self.getNextChild(pCurNode, dValue) 这是您的问题。

这是因为循环可能不会在叶子中退出,而且这个语句

None

无法找到下一个孩子。

类似地,对于节点可能无法找到任何下一个子节点或父节点的其他语句(因此返回类似if pCurNode and pCurNode.isLeaf(): # insert data here 的值)。

最后插入这样的支票:

[
  {
    "itemId":"{BA26159A-194D-4A3C-9D1A-DA9472F11BE0}",
    "selected":true
   },
   {
     "itemId":"{E651D0CD-0E7E-4903-8E26-0D1D5A168E69}",
     "selected":false
   },
   {
     "itemId":"{E651D0CD-0E7E-4903-8E26-0D1D5A168E70}",
     "selected":false
   }
]