python - 静态方法的全局名称未定义错误
问题描述
对于下面我为二叉搜索树编写的代码,我收到错误 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中,当我们定义一个staticmethod
表示类名的类名时namespace
,你不能在静态方法中访问类的任何成员。
如果您想要static
C# 中的方法,请尝试classmethod
.
我推荐vs的热门问题。classmethod
staticmethod
在特定问题中,更改您的代码,如下所示:
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)
推荐阅读
- java - 如何使 Vertx MongoClient 操作同步但不阻塞 Java 中的事件循环?
- vue.js - 如何在 Vue 中将 v-model 与功能模板组件一起使用?
- php - php -r 中的 -r 参数是什么意思?
- xamarin.forms - 在 Android P 上通过 TelephonyManager 终止来电不起作用
- c++ - 堆缓冲区溢出随机发生.......对于一个简单的代码?(我是 C++ 新手)
- google-apps-script - 有没有办法在 Google Apps 脚本中获取字符属性?
- sed - sed 替换未知字符串的位置匹配除以用户定义的分隔符
- javascript - 阴谋在过去
- docker - 如何测试 gcr.io 中是否已存在 docker 映像的特定标签?
- javascript - Material-UI按钮点击后消失