对于下面为二进制搜索树编写的代码,出现错误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)
答案 0 :(得分:0)
您的班级设计似乎令人困惑。
在python中,当我们定义staticmethod
时表示类名就像namespace
一样,则无法在静态方法中访问该类的任何成员。
如果要在C#中使用static
方法,请尝试classmethod
。
我推荐classmethod
与staticmethod
的{{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