我了解到,在定义函数时,我们必须使用self作为第一个参数,但是在我的insert_node方法的特定编码示例中,我在调用insert_node(node,new_node)时遇到错误,说不使用self作为3个参数insert_node中的第一个参数
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)
def insert(self,value):
if self.root == None:
self.root = Node(value)
return
curr = self.root
new_node = Node(value)
def insert_node(self,node,new_node):
if node.value == new_node.value:
return
if node.value > new_node.value:
if node.left is None:
node.left = new_node
return
else:
insert_node(self,node.left,new_node)
else:
if node.right is None:
node.right = new_node
return
else:
insert_node(self,node.right,new_node)
insert_node(self,curr,new_node)
答案 0 :(得分:4)
insert_node()
不是方法,它是嵌套在insert()
中的函数。您根本不需要在此函数中使用self
,因为它不使用该参数,即使使用了它,它也可以从父级{{1 }}方法作为结束符。
完全删除self
参数是可行的:
insert()
您也可以将self
方法的函数移出,它不需要嵌套在其中:
class BST:
def __init__(self,value=None):
self.root = Node(value)
def insert(self,value):
if self.root == None:
self.root = Node(value)
return
curr = self.root
new_node = Node(value)
def insert_node(node, new_node):
if node.value == new_node.value:
return
if node.value > new_node.value:
if node.left is None:
node.left = new_node
return
else:
insert_node(node.left, new_node)
else:
if node.right is None:
node.right = new_node
return
else:
insert_node(node.right, new_node)
insert_node(curr, new_node)
但是,这实际上应该是insert()
类上的方法 :
def insert_node(node, new_node):
if node.value == new_node.value:
return
if node.value > new_node.value:
if node.left is None:
node.left = new_node
return
else:
insert_node(node.left, new_node)
else:
if node.right is None:
node.right = new_node
return
else:
insert_node(node.right, new_node)
class BST:
def __init__(self,value=None):
self.root = Node(value)
def insert(self,value):
if self.root == None:
self.root = Node(value)
return
curr = self.root
new_node = Node(value)
insert_node(curr, new_node)
由于您通过Node
,class Node:
def __init__(self, value=None):
self.value = value
self.left = None
self.right = None
def insert_node(self, new_node):
if self.value == new_node.value:
return
if self.value > new_node.value:
if self.left is None:
self.left = new_node
return
else:
self.left.insert_node(new_node)
else:
if self.right is None:
self.right = new_node
return
else:
self.right.insert_node(new_node)
class BST:
def __init__(self,value=None):
self.root = Node(value)
def insert(self,value):
if self.root == None:
self.root = Node(value)
return
curr = self.root
new_node = Node(value)
curr.insert_node(new_node)
和insert_node()
访问Node
实例上的curr.insert_node(...)
,因此Python将其绑定到该实例,并且作为self.left.insert_node(...)
传递给方法。