Python 参数数无效(TypeError),但给出了精确的参数

Python 参数数无效(TypeError),但给出了精确的参数,python,oop,binary-search-tree,Python,Oop,Binary Search Tree,我试图创建一个二进制搜索树,但它给了我一个TypeError。如何将第二个参数(node)作为对象本身传递给insert(),因为第一个参数(self)始终是BSTNode的实例 # Binary Search Tree # Create a BST and insert elements and print Inorder traversal class BSTNode(object): def __init__(self, key, left=None, right=None):

我试图创建一个二进制搜索树,但它给了我一个
TypeError
。如何将第二个参数(
node
)作为对象本身传递给
insert()
,因为第一个参数(
self
)始终是
BSTNode
的实例

# Binary Search Tree
# Create a BST and insert elements and print Inorder traversal


class BSTNode(object):
    def __init__(self, key, left=None, right=None):
        self.left = left
        self.right = right
        self.key = key

    @property
    def insert(self, node, key):
        if node is None:
            return BSTNode(key)
        elif key < node.key:
            node.left = insert(node.left, key)
        elif key > node.key:
            node.right = insert(node.right, key)
        return node

    @property
    def inorder(root):
        if root:
            inorder(root.left)
            print(root.key)
            inorder(root.right)

if __name__ == "__main__":
    bst = BSTNode(50)
    bst.insert(bst, 30)
    bst.insert(bst, 20)
    bst.insert(bst, 40)
    bst.insert(bst, 70)
    bst.insert(bst, 60)
    bst.insert(bst, 80)

    inorder(root)

您不应该在此处为
insert()
函数创建
@property
(在本例中,也不应该为
inoorder()
创建属性)

属性应用于管理具有getter、setter和deleter的类的属性。
getter
(使用
@属性创建的
装饰,并在通过
bst.insert
访问属性时调用)必须使用单个参数
self
。然后,它(通常)返回分配给它的属性

相反,像使用普通的
方法一样使用它
并添加元素而不修饰它,请注意我如何将
self
添加到您的
insert()
调用中:

 def insert(self, node, key):
    if node is None:
        return BSTNode(key)
    elif key < node.key:
        node.left = self.insert(node.left, key)
    elif key > node.key:
        node.right = self.insert(node.right, key)
    return node
def插入(自身、节点、键):
如果节点为无:
返回节点(键)
elif keynode.key:
node.right=self.insert(node.right,键)
返回节点
现在插入工作正常,并返回新的节点对象:

bst.insert(root, 30)
# returns <__main__.BSTNode at 0x7fd9f74a8668>
bst.insert(根,30)
#返回

发生这种情况的原因是,属性的(
\uuuuuu get\uuuuu
)函数在内部调用函数(
insert
),该函数被修饰为getter,但只有一个参数
insert(instanceOfClass)

因为您已经用多个参数定义了函数
insert()
,所以当进行此调用时,您将得到一个很好的
TypeError

@rohit varshney

原因:属性装饰器有3个输入参数(fget、fset、fdel)、文档字符串

此处的属性装饰器用法不正确,因此出现错误

修复:请删除insert def上面的@property

装饰师教程:

你认为
@property
到底是做什么的?您根本没有正确使用它。只需删除
@属性
装饰程序即可。属性是一个声明为getter的函数,它接受一个参数:
self
,并返回属性的值。优点是能够调用
val=obj.prop
而不是
val=obj.prop()
,从而掩盖了属性是计算而不是固定值的事实。除了不正确的
@property
用法之外,python中的方法调用还需要
self
前缀。使用
self.insert()。
bst.insert(root, 30)
# returns <__main__.BSTNode at 0x7fd9f74a8668>