AttributeError: type object 'BST' has no attribute 'contains'

AttributeError: type object 'BST' has no attribute 'contains'

我一直收到属性错误,BST 不包含属性,但它包含,这是一个简单的 BST 程序,用于检查节点是否包含子树。

我是 python 的新手,所以我不知道这里的问题是什么,我们将不胜感激。

from collections import namedtuple


class BST:
    #We are using namedtuple since it allows us to create an object with names for each position
      tuple = namedtuple('tuple', ['left', 'right', 'value'])



#here, contains is a static method since we have to create a utility function to check 
#if the node has the value in its subtrees.

@staticmethod
def contains(root, value):
      if root.value == value:
          return True
        
     #means the value is greater than the root node and must lie on the right sub-tree.
      elif root.value < value:
            
            #if the right subtree is empty, than the said node does not contain the value, return false.
          if root.right == None:
               return False
            
            
            
           #it does contain a right subtree, recursively call the contains method again till you find the value.
          else:
               return BST.contains(root.right,value)
            
     #else,root value is lesser than the root node and must lie on the left side.
      else:
            
        
        
        #if the left subtree is empty, than the said node does not contain the value, return false.
          if root.left == None:
              return False
          else:
              return BST.contains(root.left,value)
         


n1 = BST.tuple(value=1, left=None, right=None)
n3 = BST.tuple(value=3, left=None, right=None)
n2 = BST.tuple(value=2, left=n1, right=n3)



result= BST.contains(n2, 3)
print (result)

您的静态方法缩进错误。在 Python 中,由于没有大括号表示 class 结束的位置,因此在 class 定义之后与 Python 代码的第一部分处于同一级别的任何缩进都是被认为是 class.

的一部分

像这样缩进你的静态方法,它会起作用:

class BST:
    #We are using namedtuple since it allows us to create an object with names for each position
    tuple = namedtuple('tuple', ['left', 'right', 'value'])



    #here, contains is a static method since we have to create a utility function to check 
    #if the node has the value in its subtrees.
    @staticmethod
    def contains(root, value):
        ....

P.S。我建议不要使用 tuple 作为 class 的属性名称,因为它是 built-in function 并且应该始终可用(不会被命名空间中的其他内容所掩盖)。