首页 > 解决方案 > 静态方法的全局名称未定义错误

问题描述

对于下面我为二叉搜索树编写的代码,我收到错误 delete_node(curr,value) NameError: global name 'delete_node' is not defined。我想知道为什么从实例方法 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)

标签: python

解决方案


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

在python中,当我们定义一个staticmethod表示类名的类名时namespace,你不能在静态方法中访问类的任何成员。

如果您想要staticC# 中的方法,请尝试classmethod.

我推荐vs的热门问题classmethodstaticmethod

在特定问题中,更改您的代码,如下所示:

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)

推荐阅读