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

时间:2019-05-26 21:39:08

标签: python

我了解到,在定义函数时,我们必须使用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)

1 个答案:

答案 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)

由于您通过Nodeclass 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(...)传递给方法。