gpt4 book ai didi

python - 为什么我们需要在调用另一个类函数时将 self 作为参数

转载 作者:太空宇宙 更新时间:2023-11-04 09:29:13 25 4
gpt4 key购买 nike

我知道在定义函数时我们必须使用 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)

最佳答案

insert_node() 不是方法,它是嵌套在 insert() 中的函数。您根本不需要在此函数中使用 self,因为它不使用该参数,即使它使用了,它也可以访问 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)

因为您在 Node 实例上访问 insert_node()(通过 curr.insert_node(...)self.left .insert_node(...)self.right.insert_node(...),它由 Python 为您绑定(bind)到该实例,并作为 传递到方法中 self

关于python - 为什么我们需要在调用另一个类函数时将 self 作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56317551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com