静态方法未定义全局名称错误

时间:2019-05-27 01:54:42

标签: python

对于下面为二进制搜索树编写的代码,出现错误delete_node(curr,value) NameError:全局名称'delete_node'未定义。我想知道为什么从实例方法delete(self,value)调用的静态方法会出现这种情况。为什么它不能用作静态方法?我从实例方法“删除”中调用它,所以它不需要显式访问实例成员。

class Node:
    def __init__(self,value=None):
        self.value = value
        self.left = None
        self.right = None

class BST:
    def __init__(self,value=None):
        self.root = Node(value)
    @staticmethod
    def delete_node(node,value):
       if node is None:
           return node
       if value > node.value:
           node.right = delete_node(node.right,value)
       elif value < node.value:
           node.left = delete_node(node.left,value)
       else:
           if node.left is None and node.right is None:
               node = None
               return None
           elif node.left is None:
               temp = node.right
               node = None
               return temp
           elif node.right is None:
               temp = node.left
               node = None
               return temp
           else:
            #min_value = get_min(node.right)
               node.value = get_min(node.right)
               node.right = delete_node(node.right,node.value)

       def delete(self,value):
           if self.root == None:
           return
           curr = self.root
           delete_node(curr,value)
def get_min(node):
    curr = node
    while curr.left:
        curr = curr.left
    return curr.value

if __name__ == '__main__':
    tree = BST(5)
    tree.delete(5)

2 个答案:

答案 0 :(得分:0)

您的班级设计似乎令人困惑。

在python中,当我们定义staticmethod时表示类名就像namespace一样,则无法在静态方法中访问该类的任何成员。

如果要在C#中使用static方法,请尝试classmethod

我推荐classmethodstaticmethod的{​​{3}}。

在特定问题中,如下更改代码:

class BST:
    ...
    @staticmethod
    def delete_node(node,value):
    ...
               node.right = BST.delete_node(node.right,node.value)

    def delete(self,value):
        ...
        BST.delete_node(curr,value)

答案 1 :(得分:0)

就像其他人一样,要在类对象上调用方法,您必须指定要对其进行调用的对象。

因此,在使用CREATE PROCEDURE [dbo].[usp_GetStatus] @siteId INT = NULL, ........ from sites; WHERE StartDate = @reportMonth AND.. AND ... AND (@siteId IS NULL OR sites.SiteId = @siteId) 的地方,可以使用delete_node,因为它是静态的。考虑到BST通常是作为一个完全封装的对象完成的,因此设计有些奇怪,但这是您的直接问题。

如果它是一个实例方法,那么您将调用BST.delete_node